/ Hex Artifact Content
Login

Artifact 123dd6ab71226ee9c41d6658fd11b2f7bed73f44:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 36 39 33 20 32 30 30 39 2f 30  c,v 1.693 2009/0
0190: 37 2f 32 30 20 31 39 3a 33 30 3a 30 31 20 64 72  7/20 19:30:01 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72  eTrace=1;  /* Tr
03a0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61  ue to enable tra
03b0: 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69 6e 65  cing */.# define
03c0: 20 54 52 41 43 45 28 58 29 20 20 69 66 28 73 71   TRACE(X)  if(sq
03d0: 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65 29  lite3BtreeTrace)
03e0: 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75 73 68  {printf X;fflush
03f0: 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c 73 65  (stdout);}.#else
0400: 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28  .# define TRACE(
0410: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0420: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0440: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0450: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0460: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0470: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0480: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0490: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
04a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
04b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
04c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
04d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
04e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
04f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0500: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0510: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0520: 2a 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20  **.** Access to 
0530: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
0540: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 53 51   protected by SQ
0550: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0560: 43 5f 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66  C_MASTER..*/.#if
0570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0580: 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45  BtShared *SQLITE
0590: 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68 61 72  _WSD sqlite3Shar
05a0: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
05b0: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74  .#else.static Bt
05c0: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
05d0: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
05e0: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
05f0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
0600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0610: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0640: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0650: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0660: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0670: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0690: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
06a0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06c0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06d0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06e0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06f0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
0700: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0710: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0720: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0730: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0750: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0760: 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  ){.  sqlite3Glob
0770: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
0780: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e  acheEnabled = en
0790: 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  able;.  return S
07a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
07b0: 69 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  if....#ifdef SQL
07c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
07d0: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
07e0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
07f0: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0800: 62 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68  bleLock(), setSh
0810: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0820: 63 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63  ck(),.  ** and c
0830: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0840: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20  heTableLocks(). 
0850: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0860: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0870: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0880: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0890: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
08a0: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
08b0: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08c0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08d0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08e0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
08f0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0900: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0910: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0920: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0930: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0940: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0950: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0960: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0970: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0980: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0990: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
09a0: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
09b0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
09c0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
09d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
09e0: 66 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61  fine setSharedCa
09f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  cheTableLock(a,b
0a00: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a10: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c  #define clearAll
0a20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a30: 4c 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69  Locks(a).  #defi
0a40: 6e 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  ne downgradeAllS
0a50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0a60: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0a70: 65 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  e hasSharedCache
0a80: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c  TableLock(a,b,c,
0a90: 64 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68  d) 1.  #define h
0aa0: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
0ab0: 61 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a  a, b) 0.#endif..
0ac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ad0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0ae0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0af0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
0b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0b10: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0b20: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0b30: 61 74 65 6d 65 6e 74 2e 20 49 74 20 63 68 65 63  atement. It chec
0b40: 6b 73 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 6e 65  ks.** that conne
0b50: 63 74 69 6f 6e 20 70 20 68 6f 6c 64 73 20 74 68  ction p holds th
0b60: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
0b70: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
0b80: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 62 2d 74  e to the .** b-t
0b90: 72 65 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ree with root pa
0ba0: 67 65 20 69 52 6f 6f 74 2e 20 49 66 20 73 6f 2c  ge iRoot. If so,
0bb0: 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65   true is returne
0bc0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  d. Otherwise, fa
0bd0: 6c 73 65 2e 20 0a 2a 2a 20 46 6f 72 20 65 78 61  lse. .** For exa
0be0: 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69 74 69  mple, when writi
0bf0: 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 2d  ng to a table b-
0c00: 74 72 65 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  tree with root-p
0c10: 61 67 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a  age iRoot via .*
0c20: 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69  * Btree connecti
0c30: 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a  on pBtree:.**.**
0c40: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 73 53      assert( hasS
0c50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0c60: 6f 63 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  ock(pBtree, iRoo
0c70: 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b  t, 0, WRITE_LOCK
0c80: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ) );.**.** When 
0c90: 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  writing to an in
0ca0: 64 65 78 20 62 2d 74 72 65 65 20 74 68 61 74 20  dex b-tree that 
0cb0: 72 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61  resides in a sha
0cc0: 72 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20  rable database, 
0cd0: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73  the .** caller s
0ce0: 68 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74  hould have first
0cf0: 20 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b   obtained a lock
0d00: 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20   specifying the 
0d10: 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
0d20: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
0d30: 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  g table b-tree. 
0d40: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d50: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d60: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d80: 74 73 20 65 61 63 68 20 62 2d 74 72 65 65 20 61  ts each b-tree a
0d90: 73 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72  s a separate str
0da0: 75 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72  ucture. To deter
0db0: 6d 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  mine.** the tabl
0dc0: 65 20 62 2d 74 72 65 65 20 63 6f 72 72 65 73 70  e b-tree corresp
0dd0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
0de0: 64 65 78 20 62 2d 74 72 65 65 20 62 65 69 6e 67  dex b-tree being
0df0: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
0e00: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
0e10: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
0e20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
0e30: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
0e40: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
0e50: 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f 6f 74   the b-tree root
0e60: 65 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74  ed at page iRoot
0e70: 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
0e80: 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65  .** hold a write
0e90: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
0ea0: 65 6d 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20  ema table (root 
0eb0: 70 61 67 65 20 31 29 2e 20 54 68 69 73 20 69 73  page 1). This is
0ec0: 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61   also.** accepta
0ed0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
0ee0: 6e 74 20 68 61 73 53 68 61 72 65 64 43 61 63 68  nt hasSharedCach
0ef0: 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74  eTableLock(.  Bt
0f00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
0f10: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
0f20: 68 61 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f  hat must hold lo
0f30: 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f  ck */.  Pgno iRo
0f40: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot,            /
0f50: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62  * Root page of b
0f60: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
0f70: 73 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  sIndex,         
0f80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f    /* True if iRo
0f90: 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f  ot is the root o
0fa0: 66 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  f an index b-tre
0fb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b  e */.  int eLock
0fc0: 54 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Type          /*
0fd0: 20 52 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74   Required lock t
0fe0: 79 70 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  ype (READ_LOCK o
0ff0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f  r WRITE_LOCK) */
1000: 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53  .){.  Schema *pS
1010: 63 68 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20  chema = (Schema 
1020: 2a 29 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  *)pBtree->pBt->p
1030: 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69  Schema;.  Pgno i
1040: 54 61 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  Tab = 0;.  BtLoc
1050: 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  k *pLock;..  /* 
1060: 49 66 20 74 68 69 73 20 62 2d 74 72 65 65 20 64  If this b-tree d
1070: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73  atabase is not s
1080: 68 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20  hareable, or if 
1090: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
10a0: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68  ading.  ** and h
10b0: 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  as the read-unco
10c0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74  mmitted flag set
10d0: 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69  , then no lock i
10e0: 73 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a  s required. .  *
10f0: 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1100: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   return true imm
1110: 65 64 69 61 74 65 6c 79 2e 20 20 49 66 20 74 68  ediately.  If th
1120: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1130: 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 20 77 72 69  ing .  ** or wri
1140: 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d  ting an index b-
1150: 74 72 65 65 2c 20 62 75 74 20 74 68 65 20 73 63  tree, but the sc
1160: 68 65 6d 61 20 69 73 20 6e 6f 74 20 6c 6f 61 64  hema is not load
1170: 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ed, then return.
1180: 20 20 2a 2a 20 74 72 75 65 20 61 6c 73 6f 2e 20    ** true also. 
1190: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
11a0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
11b0: 64 2c 20 62 75 74 20 69 74 20 69 73 20 74 6f 6f  d, but it is too
11c0: 20 64 69 66 66 69 63 75 6c 74 0a 20 20 2a 2a 20   difficult.  ** 
11d0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
11e0: 63 6c 69 65 6e 74 20 61 63 74 75 61 6c 6c 79 20  client actually 
11f0: 68 6f 6c 64 73 20 69 74 2e 20 54 68 69 73 20 64  holds it. This d
1200: 6f 65 73 6e 27 74 20 68 61 70 70 65 6e 20 76 65  oesn't happen ve
1210: 72 79 0a 20 20 2a 2a 20 6f 66 74 65 6e 2e 20 20  ry.  ** often.  
1220: 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65 65  */.  if( (pBtree
1230: 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a 20  ->sharable==0). 
1240: 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65 3d    || (eLockType=
1250: 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28 70  =READ_LOCK && (p
1260: 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Btree->db->flags
1270: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
1280: 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20 20 20 7c  committed)).   |
1290: 7c 20 28 69 73 49 6e 64 65 78 20 26 26 20 28 21  | (isIndex && (!
12a0: 70 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68  pSchema || (pSch
12b0: 65 6d 61 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63  ema->flags&DB_Sc
12c0: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 20 29  hemaLoaded)==0 )
12d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
12e0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
12f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1300: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1310: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
1320: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
1330: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
1340: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
1350: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1360: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
1370: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1380: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1390: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
13a0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
13b0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
13c0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
13d0: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
13e0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
13f0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1400: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1410: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
1420: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
1430: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
1440: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
1450: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
1460: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
1470: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 52  ( pIdx->tnum==iR
1480: 6f 6f 74 20 29 7b 0a 09 69 54 61 62 20 3d 20 70  oot ){..iTab = p
1490: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
14a0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
14b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
14c0: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
14d0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
14e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
14f0: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
1500: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
1510: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
1520: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
1530: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
1540: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
1550: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1560: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1570: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1580: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1590: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
15a0: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
15b0: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
15c0: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
15d0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
15e0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
15f0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1600: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1610: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1620: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1630: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1640: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1650: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1660: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1670: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1690: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
16a0: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
16b0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
16c0: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
16d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
16e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
16f0: 73 6f 20 75 73 65 64 20 61 73 20 70 61 72 74 20  so used as part 
1700: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
1710: 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 49 74 20  ements only. It 
1720: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65  .** returns true
1730: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20   if there exist 
1740: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  one or more curs
1750: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
1760: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
1770: 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 20 74  oot page iRoot t
1780: 68 61 74 20 64 6f 20 6e 6f 74 20 62 65 6c 6f 6e  hat do not belon
1790: 67 20 74 6f 20 65 69 74 68 65 72 20 63 6f 6e 6e  g to either conn
17a0: 65 63 74 69 6f 6e 20 70 42 74 72 65 65 20 0a 2a  ection pBtree .*
17b0: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
17c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
17d0: 68 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63  has the read-unc
17e0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
17f0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  t..**.** For exa
1800: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1810: 74 69 6e 67 20 74 6f 20 70 61 67 65 20 69 52 6f  ting to page iRo
1820: 6f 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73  ot:.**.**    ass
1830: 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e  ert( !hasReadCon
1840: 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20 69  flicts(pBtree, i
1850: 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  Root) );.*/.stat
1860: 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f  ic int hasReadCo
1870: 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70  nflicts(Btree *p
1880: 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f  Btree, Pgno iRoo
1890: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18a0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  p;.  for(p=pBtre
18b0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18c0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
18d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
18e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20  Root==iRoot .   
18f0: 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d    && p->pBtree!=
1900: 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20 30  pBtree.     && 0
1910: 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62  ==(p->pBtree->db
1920: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1930: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
1940: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1950: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1960: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1970: 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69  .#endif    /* #i
1980: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1990: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  G */../*.** Quer
19a0: 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65  y to see if btre
19b0: 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f  e handle p may o
19c0: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
19d0: 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28  type eLock .** (
19e0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
19f0: 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20  TE_LOCK) on the 
1a00: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1a10: 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72  page iTab. Retur
1a20: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  n.** SQLITE_OK i
1a30: 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62  f the lock may b
1a40: 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63  e obtained (by c
1a50: 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61  alling.** setSha
1a60: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a70: 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f  k()), or SQLITE_
1a80: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
1a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
1aa0: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1ab0: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
1ac0: 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65   Pgno iTab, u8 e
1ad0: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
1ae0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1af0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1b00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b10: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1b20: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1b30: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1b40: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
1b50: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
1b60: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
1b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28 70  );.  assert( !(p
1b80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
1b90: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1ba0: 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  ed)||eLock==WRIT
1bb0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
1bc0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
1bd0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
1be0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
1bf0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
1c00: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
1c10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1c20: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
1c30: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
1c40: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
1c50: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
1c60: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
1c70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1c80: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
1c90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ca0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1cb0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
1cc0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
1cd0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
1ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1cf0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1d00: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1d10: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d20: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
1d30: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1d40: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1d50: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1d60: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1d70: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
1d80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
1da0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1db0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
1dc0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1dd0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
1de0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
1df0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
1e00: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
1e10: 69 74 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e  iter!=p && pBt->
1e20: 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
1e30: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1e40: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1e50: 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d  b, pBt->pWriter-
1e60: 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
1e70: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1e80: 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
1e90: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1ea0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1eb0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1ec0: 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  xt){.    /* The 
1ed0: 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72  condition (pIter
1ee0: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20  ->eLock!=eLock) 
1ef0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1f00: 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a   if(...) .    **
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20   statement is a 
1f20: 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f  simplification o
1f30: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1f40: 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45     (eLock==WRITE
1f50: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1f60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f70: 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  K).    **.    **
1f80: 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
1f90: 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52  hat if eLock==WR
1fa0: 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e  ITE_LOCK, then n
1fb0: 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1fc0: 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f  on.    ** may ho
1fd0: 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20  ld a WRITE_LOCK 
1fe0: 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20  on any table in 
1ff0: 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65  this file (since
2000: 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a   there can.    *
2010: 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  * only be a sing
2020: 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20  le writer)..    
2030: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2040: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2050: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d  D_LOCK || pIter-
2060: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
2070: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
2080: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2090: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74  CK || pIter->pBt
20a0: 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d  ree==p || pIter-
20b0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
20c0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  K);.    if( pIte
20d0: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
20e0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
20f0: 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c  Tab && pIter->eL
2100: 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock!=eLock ){.  
2110: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
2120: 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
2130: 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65  db, pIter->pBtre
2140: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  e->db);.      if
2150: 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ( eLock==WRITE_L
2160: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OCK ){.        a
2170: 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70  ssert( p==pBt->p
2180: 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
2190: 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67    pBt->isPending
21a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21c0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
21d0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
21e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2200: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2210: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2230: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2240: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2250: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2260: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2270: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
2280: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
2290: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
22a0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
22b0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
22c0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
22d0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
22e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22f0: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2300: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2310: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2320: 65 64 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63  ed b-tree connec
2330: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 69 73 20 63  tion handle is c
2340: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68  onnected to a sh
2350: 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20  arable.**       
2360: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 20  b-tree database 
2370: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
2380: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 29  Shared.sharable)
2390: 20 66 6c 61 67 20 73 65 74 2c 20 61 6e 64 0a 2a   flag set, and.*
23a0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
23b0: 68 65 72 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65  her b-tree conne
23c0: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 68 6f 6c  ction handle hol
23d0: 64 73 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ds a lock that c
23e0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
23f0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
2400: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
2410: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2420: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2430: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2440: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2450: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2460: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2470: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2480: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2490: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
24a0: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
24b0: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
24c0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
24d0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
24e0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
24f0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2500: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2510: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
2520: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2530: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2540: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2550: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2560: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2570: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2580: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2590: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
25a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
25b0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
25c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
25d0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
25e0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
25f0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
2600: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
2610: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
2620: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2630: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2640: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2650: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2660: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2670: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2680: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2690: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
26a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
26b0: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
26c0: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
26d0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
26e0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
26f0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2700: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2710: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2720: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2730: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
2740: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
2750: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2760: 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65  ed on a sharable
2770: 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74   b-tree after it
2780: 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20   .  ** has been 
2790: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
27a0: 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20  no other b-tree 
27b0: 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74  holds a conflict
27c0: 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  ing lock.  */.  
27d0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
27e0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
27f0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
2800: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2810: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
2820: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
2830: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
2840: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
2850: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
2860: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
2870: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2880: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
2890: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
28a0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
28b0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
28c0: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
28d0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
28e0: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
28f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2900: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2910: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
2920: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
2930: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
2940: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
2950: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
2960: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
2970: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
2980: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
2990: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
29a0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
29b0: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
29c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
29d0: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
29e0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
29f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2a10: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
2a20: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
2a30: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
2a40: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
2a50: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
2a60: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
2a70: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
2a80: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
2a90: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
2aa0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2ab0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
2ac0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
2ad0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
2ae0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
2af0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
2b00: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
2b10: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
2b20: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
2b30: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
2b40: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
2b50: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
2b60: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
2b70: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
2b80: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
2b90: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
2ba0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
2bb0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2bc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2bd0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2be0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2bf0: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2c00: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2c10: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
2c20: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
2c30: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
2c40: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
2c50: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
2c60: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2c70: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
2c80: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
2c90: 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20  handle p..**.** 
2ca0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2cb0: 73 75 6d 65 73 20 74 68 61 74 20 68 61 6e 64 6c  sumes that handl
2cc0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2cd0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2ce0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2cf0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2d00: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2d10: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2d20: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2d30: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2d40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2d50: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2d60: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2d70: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2d80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2d90: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2da0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2db0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2dc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2dd0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2de0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2df0: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2e00: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2e10: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2e20: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2e30: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2e40: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2e50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2e60: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2e70: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2e80: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2e90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ea0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2eb0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2ec0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ed0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
2ee0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
2ef0: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
2f00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f10: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
2f20: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
2f30: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
2f40: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
2f50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f60: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
2f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2f80: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
2f90: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
2fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
2fb0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
2fc0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
2fd0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
2fe0: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
2ff0: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3000: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3010: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3020: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3030: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3040: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3050: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3060: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3070: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3080: 77 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  when connection 
3090: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
30a0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
30b0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
30c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
30d0: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
30e0: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
30f0: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3100: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3110: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3120: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3130: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3140: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
3150: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
3160: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
3170: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
3180: 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61  he isPending fla
3190: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
31a0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
31b0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
31c0: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
31d0: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
31e0: 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  g must.    ** be
31f0: 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53   zero already. S
3200: 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65  o this next line
3210: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20   is harmless in 
3220: 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
3230: 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  /.    pBt->isPen
3240: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  ding = 0;.  }.}.
3250: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3260: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
3270: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
3280: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  d by connection 
3290: 70 20 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  p to read-locks.
32a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32b0: 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
32c0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
32d0: 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  s(Btree *p){.  B
32e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32f0: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ->pBt;.  if( pBt
3300: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3310: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3320: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  k;.    pBt->pWri
3330: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3340: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
3350: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65  0;.    pBt->isPe
3360: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66  nding = 0;.    f
3370: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c  or(pLock=pBt->pL
3380: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
3390: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
33a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33b0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Lock->eLock==REA
33c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
33d0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20  >pBtree==p );.  
33e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b      pLock->eLock
33f0: 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
3400: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69    }.  }.}..#endi
3410: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3420: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3430: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
3440: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
3450: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
3460: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3470: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
3480: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3490: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
34a0: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
34b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
34c0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
34d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
34e0: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
34f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3500: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3510: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3520: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3530: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3540: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3550: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3560: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3570: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3580: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3590: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
35a0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
35b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
35c0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
35d0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
35e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
35f0: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3600: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3610: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3620: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3630: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3640: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3650: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3660: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3670: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3680: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3690: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
36a0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
36b0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
36c0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
36d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3700: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3710: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3720: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3730: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3740: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3760: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3770: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3780: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3790: 65 0a 2a 2a 20 62 2d 74 72 65 65 20 74 6f 20 69  e.** b-tree to i
37a0: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
37b0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74  crblob cursors t
37c0: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  hat are open on 
37d0: 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e  the.** row or on
37e0: 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65  e of the rows be
37f0: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 41 72  ing modified. Ar
3800: 67 75 6d 65 6e 74 20 70 67 6e 6f 52 6f 6f 74 20  gument pgnoRoot 
3810: 69 73 20 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 2d  is the .** root-
3820: 70 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c  page of the tabl
3830: 65 20 62 2d 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a  e b-tree. .**.**
3840: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3850: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3860: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3870: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3880: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3890: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
38a0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
38b0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
38c0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
38d0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
38e0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
38f0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3900: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3910: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3920: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3930: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3940: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3950: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3960: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3970: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3980: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3990: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
39a0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
39b0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
39c0: 68 69 73 20 73 70 65 63 69 66 69 63 20 72 6f 77  his specific row
39d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
39e0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
39f0: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
3a00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
3a10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
3a20: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
3a30: 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  eck */.  Pgno pg
3a40: 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  noRoot,         
3a50: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61   /* Look for rea
3a60: 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 69  d cursors on thi
3a70: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 36 34  s btree */.  i64
3a80: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3a90: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3aa0: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3ab0: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3ac0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3ad0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ae0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3af0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3b00: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3b10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3b20: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3b30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3b40: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3b50: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3b60: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3b70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3b80: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3b90: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3ba0: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3bb0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3bc0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3bd0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3be0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3bf0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3c00: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3c10: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3c20: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3c30: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3c40: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3c50: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3c60: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77  ncrblobCursors(w
3c70: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
3c80: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
3c90: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
3ca0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
3cb0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
3cc0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
3cd0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
3ce0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
3cf0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
3d00: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
3d10: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
3d20: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
3d30: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
3d40: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
3d50: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
3d60: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
3d70: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
3d80: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
3d90: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
3da0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
3db0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3dc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
3dd0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
3de0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
3df0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
3e00: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
3e10: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
3e20: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
3e30: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
3e40: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
3e50: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
3e60: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
3e70: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
3e80: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
3e90: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
3ea0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
3eb0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
3ec0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
3ed0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
3ee0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
3ef0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
3f00: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
3f10: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
3f20: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
3f30: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
3f40: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
3f50: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
3f60: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
3f70: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
3f80: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
3f90: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
3fa0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
3fb0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
3fc0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
3fd0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
3fe0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
3ff0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4000: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4010: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4020: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4030: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4040: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4050: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4060: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4070: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4080: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4090: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
40a0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
40b0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
40c0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
40d0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
40e0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
40f0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4100: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4110: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4120: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4130: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4140: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4150: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4160: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4170: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4180: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4190: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
41a0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
41b0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
41c0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
41d0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
41e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
41f0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4200: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4210: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4220: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4230: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4240: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4250: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4260: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4270: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4280: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4290: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
42a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
42b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
42c0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
42d0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
42e0: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
42f0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4300: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4310: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4320: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4330: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4340: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4350: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4360: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4380: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4390: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
43a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
43b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
43c0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
43d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
43e0: 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 31     int nPage = 1
43f0: 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  00;.    sqlite3P
4400: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
4410: 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
4420: 65 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  e);.    /* If sq
4430: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
4440: 75 6e 74 28 29 20 66 61 69 6c 73 20 74 68 65 72  unt() fails ther
4450: 65 20 69 73 20 6e 6f 20 68 61 72 6d 20 62 65 63  e is no harm bec
4460: 61 75 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  ause the.    ** 
4470: 6e 50 61 67 65 20 76 61 72 69 61 62 6c 65 20 69  nPage variable i
4480: 73 20 75 6e 63 68 61 6e 67 65 64 20 66 72 6f 6d  s unchanged from
4490: 20 69 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c   its default val
44a0: 75 65 20 6f 66 20 31 30 30 20 2a 2f 0a 20 20 20  ue of 100 */.   
44b0: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
44c0: 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  t = sqlite3Bitve
44d0: 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50 61  cCreate((u32)nPa
44e0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42  ge);.    if( !pB
44f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29  t->pHasContent )
4500: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
4510: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
4520: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
4530: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f  QLITE_OK && pgno
4540: 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  <=sqlite3BitvecS
4550: 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ize(pBt->pHasCon
4560: 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20  tent) ){.    rc 
4570: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
4580: 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  et(pBt->pHasCont
4590: 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ent, pgno);.  }.
45a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
45b0: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20  /*.** Query the 
45c0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
45d0: 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a  tent vector..**.
45e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
45f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4600: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4610: 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64   page is removed
4620: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65   from the.** fre
4630: 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65  e-list for reuse
4640: 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c  . It returns fal
4650: 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  se if it is safe
4660: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
4670: 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68  .** page from th
4680: 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  e pager layer wi
4690: 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
46a0: 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72  nt' flag set. Tr
46b0: 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ue otherwise..*/
46c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
46d0: 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eGetHasContent(B
46e0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
46f0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76  no pgno){.  Bitv
4700: 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61  ec *p = pBt->pHa
4710: 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75  sContent;.  retu
4720: 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73  rn (p && (pgno>s
4730: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
4740: 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  (p) || sqlite3Bi
4750: 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f  tvecTest(p, pgno
4760: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  )));.}../*.** Cl
4770: 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74 68  ear (destroy) th
4780: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4790: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
47a0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  his should be.**
47b0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
47c0: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61  conclusion of ea
47d0: 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ch write-transac
47e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
47f0: 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72 48  void btreeClearH
4800: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4810: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
4820: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
4830: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4840: 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43  t);.  pBt->pHasC
4850: 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ontent = 0;.}../
4860: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4870: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4880: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4890: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
48a0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
48b0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
48c0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
48d0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
48e0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a  REQUIRESEEK..*/.
48f0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
4900: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
4910: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
4920: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
4930: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
4940: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
4950: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
4960: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
4970: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
4980: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
4990: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
49a0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
49b0: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
49c0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
49d0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
49e0: 43 61 6e 6e 6f 74 20 66 61 69 6c 20 73 69 6e 63  Cannot fail sinc
49f0: 65 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  e pCur->eState==
4a00: 56 41 4c 49 44 20 2a 2f 0a 0a 20 20 2f 2a 20 49  VALID */..  /* I
4a10: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
4a20: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
4a30: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
4a40: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
4a50: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
4a60: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
4a70: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
4a80: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
4a90: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
4aa0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
4ab0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
4ac0: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
4ad0: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
4ae0: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
4af0: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
4b00: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
4b10: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
4b20: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
4b30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
4b40: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
4b50: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76  >intKey ){.    v
4b60: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
4b70: 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
4b80: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
4b90: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
4ba0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4bb0: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
4bc0: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
4bd0: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
4be0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4bf0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
4c00: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
4c10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4c20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4c30: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
4c40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4c50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4c60: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4c70: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
4c80: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
4c90: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
4ca0: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
4cb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4cc0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
4cd0: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
4ce0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
4cf0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4d00: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4d10: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
4d20: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
4d30: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
4d40: 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65   -1;.    pCur->e
4d50: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
4d60: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
4d70: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
4d80: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
4d90: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4da0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4db0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
4dc0: 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74  l cursors except
4dd0: 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e   pExcept open on
4de0: 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77   the table .** w
4df0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
4e00: 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68  oot. Usually, th
4e10: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  is is called jus
4e20: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a  t before cursor.
4e30: 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73  ** pExcept is us
4e40: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
4e50: 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c   table (BtreeDel
4e60: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
4e70: 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  sert())..*/.stat
4e80: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
4e90: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
4ea0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
4eb0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
4ec0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
4ed0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
4ee0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4ef0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
4f00: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
4f10: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
4f20: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
4f30: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
4f40: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
4f50: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
4f60: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
4f70: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
4f80: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
4f90: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
4fa0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
4fb0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
4fc0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fd0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  on(p);.      if(
4fe0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
4ff0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
5000: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
5010: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5020: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5030: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
5040: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5050: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
5060: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
5070: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
5080: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
5090: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
50a0: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
50b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
50c0: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
50d0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
50e0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
50f0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
5100: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
5110: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
5120: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
5130: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
5140: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
5150: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
5160: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
5170: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
5180: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
5190: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
51a0: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
51b0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
51c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
51d0: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
51e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
51f0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
5200: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
5210: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
5220: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
5230: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
5240: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
5250: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
5260: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
5270: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
5280: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
5290: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
52a0: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
52b0: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
52c0: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
52d0: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
52e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
52f0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
5300: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
5310: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
5320: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
5330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5340: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
5350: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
5360: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
5370: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
5380: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
5390: 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20  e[150];         
53a0: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
53b0: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
53c0: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
53d0: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
53e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
53f0: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
5400: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
5410: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
5420: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
5430: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
5440: 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20  nKey, pKey,.    
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66    aSpace, sizeof
5480: 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69  (aSpace));.    i
5490: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
54a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
54b0: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
54c0: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
54d0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
54e0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
54f0: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
5500: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
5510: 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65  pRes);.  if( pKe
5520: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
5530: 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
5540: 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79  edRecord(pIdxKey
5550: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5560: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  rc;.}../*.** Res
5570: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
5580: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
5590: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
55a0: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
55b0: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
55c0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
55d0: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
55e0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
55f0: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
5600: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
5610: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
5620: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
5630: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
5640: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
5650: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
5660: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5670: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
5680: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
5690: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
56a0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
56b0: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
56c0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
56d0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
56e0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
56f0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5700: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
5710: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
5720: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
5730: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
5740: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5750: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
5760: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
5770: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
5780: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5790: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
57a0: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
57b0: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
57c0: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
57d0: 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74   &pCur->skipNext
57e0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
57f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5800: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
5810: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
5820: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
5830: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5840: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
5850: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
5860: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
5870: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
5880: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
5890: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
58a0: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
58b0: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
58c0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
58d0: 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65  \.         btree
58e0: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
58f0: 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20  ition(p) : \.   
5900: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29        SQLITE_OK)
5910: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
5920: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
5930: 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f   a cursor has mo
5940: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  ved from the pos
5950: 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20  ition it.** was 
5960: 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20  last placed at. 
5970: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
5980: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
5990: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
59a0: 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74 65  .** at is delete
59b0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
59c0: 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   them..**.** Thi
59d0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
59e0: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  s an error code 
59f0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
5a00: 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a  s wrong.  The.**
5a10: 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d 6f   integer *pHasMo
5a20: 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  ved is set to on
5a30: 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  e if the cursor 
5a40: 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30 20  has moved and 0 
5a50: 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  if not..*/.int s
5a60: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
5a70: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
5a80: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
5a90: 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  HasMoved){.  int
5aa0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73   rc;..  rc = res
5ab0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5ac0: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
5ad0: 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d  rc ){.    *pHasM
5ae0: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  oved = 1;.    re
5af0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
5b00: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
5b10: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b20: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
5b30: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d  =0 ){.    *pHasM
5b40: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  oved = 1;.  }els
5b50: 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  e{.    *pHasMove
5b60: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
5b70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5b80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5b90: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
5ba0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70  ./*.** Given a p
5bb0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
5bc0: 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65  regular database
5bd0: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68   page, return th
5be0: 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
5bf0: 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72   for the pointer
5c00: 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63  -map page that c
5c10: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
5c20: 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70  y for the.** inp
5c30: 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  ut page number..
5c40: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
5c50: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
5c60: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5c70: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
5c80: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5c90: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
5ca0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
5cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5cc0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5cd0: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
5ce0: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
5cf0: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
5d00: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
5d10: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
5d20: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
5d30: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
5d40: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
5d50: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
5d60: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
5d70: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
5d80: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5d90: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
5da0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
5db0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
5dc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
5dd0: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
5de0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
5df0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
5e00: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
5e10: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
5e20: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
5e30: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
5e40: 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  no'..**.** If *p
5e50: 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  RC is initially 
5e60: 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51  non-zero (non-SQ
5e70: 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68  LITE_OK) then th
5e80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
5e90: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e   a no-op.  If an
5ea0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
5eb0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
5ec0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69  rror code is wri
5ed0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  tten.** into *pR
5ee0: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  C..*/.static voi
5ef0: 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  d ptrmapPut(BtSh
5f00: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5f10: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
5f20: 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20  gno parent, int 
5f30: 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20  *pRC){.  DbPage 
5f40: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
5f50: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
5f60: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
5f70: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
5f80: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
5f90: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
5fa0: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
5fb0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
5fc0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
5fd0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
5fe0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
5ff0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6000: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
6010: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6020: 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
6030: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
6040: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
6050: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6060: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6070: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
6080: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
6090: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d  al page number m
60a0: 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65  ust never be use
60b0: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  d as a pointer m
60c0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
60d0: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
60e0: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
60f0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6100: 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  )) );..  assert(
6110: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
6120: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
6130: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
6140: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6150: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
6160: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
6170: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
6180: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
6190: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
61a0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
61b0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
61c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
61d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
61e0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
61f0: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
6200: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
6210: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6220: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
6230: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
6240: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6250: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
6260: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
6270: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
6280: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
6290: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
62a0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
62b0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
62c0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
62d0: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
62e0: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
62f0: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
6300: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
6310: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
6320: 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43  rent));.    *pRC
6330: 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  = rc = sqlite3Pa
6340: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
6350: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
6360: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6370: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
6380: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
6390: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
63a0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
63b0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
63c0: 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20  ..ptrmap_exit:. 
63d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
63e0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a  ef(pDbPage);.}..
63f0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
6400: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
6410: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6420: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
6430: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
6440: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
6450: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
6460: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
6470: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
6480: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
6490: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
64a0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
64b0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
64c0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
64d0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
64e0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
64f0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
6500: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
6510: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6520: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
6530: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
6540: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
6550: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
6560: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6570: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
6580: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
6590: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
65a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
65b0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
65c0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
65d0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
65e0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
65f0: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
6600: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
6610: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
6620: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6630: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
6640: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
6650: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6660: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6670: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6680: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6690: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
66a0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
66b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
66c0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
66d0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
66e0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
66f0: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
6700: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
6710: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6730: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6740: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6750: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6760: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6770: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6780: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6790: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
67a0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
67b0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
67c0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
67d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
67e0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
67f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
6800: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
6810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6820: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6830: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6840: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
6850: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
6860: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6870: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6880: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
6890: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
68a0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
68b0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
68c0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
68d0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
68e0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
68f0: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
6900: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
6910: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
6920: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6930: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
6940: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6950: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
6960: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
6970: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
6980: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
6990: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
69a0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
69b0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
69c0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
69d0: 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29  (&(P)->aData[(P)
69e0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28  ->cellOffset+2*(
69f0: 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  I)])))../*.** Th
6a00: 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  is a more comple
6a10: 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e  x version of fin
6a20: 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  dCell() that wor
6a30: 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20  ks for.** pages 
6a40: 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20  that do contain 
6a50: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
6a60: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
6a70: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
6a80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
6a90: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
6aa0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
6ab0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6ac0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
6ad0: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
6ae0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
6af0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
6b00: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
6b10: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
6b20: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
6b30: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
6b40: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
6b50: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
6b60: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
6b70: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
6b80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6b90: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
6ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
6bb0: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
6bc0: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
6bd0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
6be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
6bf0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
6c00: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
6c10: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
6c20: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
6c30: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
6c40: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
6c50: 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72  ction.  btreePar
6c60: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
6c70: 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20   .** cell index 
6c80: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6c90: 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65  gument and btree
6ca0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a  ParseCellPtr() .
6cb0: 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  ** takes a point
6cc0: 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  er to the body o
6cd0: 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74  f the cell as it
6ce0: 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  s second argumen
6cf0: 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  t..**.** Within 
6d00: 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70  this file, the p
6d10: 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f  arseCell() macro
6d20: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69   can be called i
6d30: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72  nstead of.** btr
6d40: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
6d50: 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d  . Using some com
6d60: 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c  pilers, this wil
6d70: 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a  l be faster..*/.
6d80: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
6d90: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
6da0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
6dc0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6dd0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
6de0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
6df0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
6e00: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
6e10: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
6e20: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
6e30: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
6e40: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31  cture */.){.  u1
6e50: 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 n;            
6e60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6e70: 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f  bytes in cell co
6e80: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a  ntent header */.
6e90: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
6ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6eb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
6ec0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
6ed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6ee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6ef0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6f00: 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43   );..  pInfo->pC
6f10: 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61  ell = pCell;.  a
6f20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
6f30: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
6f40: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d  leaf==1 );.  n =
6f50: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
6f60: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
6f70: 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65  n==4-4*pPage->le
6f80: 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  af );.  if( pPag
6f90: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
6fa0: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
6fb0: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ata ){.      n +
6fc0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
6fd0: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
6fe0: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
6ff0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
7000: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b  0;.    }.    n +
7010: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  = getVarint(&pCe
7020: 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[n], (u64*)&pI
7030: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  nfo->nKey);.    
7040: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e  pInfo->nData = n
7050: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
7060: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  {.    pInfo->nDa
7070: 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d  ta = 0;.    n +=
7080: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
7090: 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64  ell[n], nPayload
70a0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
70b0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
70c0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
70d0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
70e0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
70f0: 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73  r = n;.  testcas
7100: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
7110: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
7120: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
7130: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
7140: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
7150: 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64   likely(nPayload
7160: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
7170: 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  l) ){.    /* Thi
7180: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
7190: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
71a0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
71b0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
71c0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
71d0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
71e0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
71f0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69    */.    int nSi
7200: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze;          /* 
7210: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65  Total size of ce
7220: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79  ll content in by
7230: 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65  tes */.    nSize
7240: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b   = nPayload + n;
7250: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
7260: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
7270: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
7280: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7290: 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e    if( (nSize & ~
72a0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  3)==0 ){.      n
72b0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
72c0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
72d0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
72e0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
72f0: 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a  Size = (u16)nSiz
7300: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
7310: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
7320: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
7330: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
7340: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
7350: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
7360: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
7370: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
7380: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
7390: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
73a0: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
73b0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
73c0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
73d0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
73e0: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
73f0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
7400: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
7410: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
7420: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
7430: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
7440: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
7450: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
7460: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
7470: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
7480: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7490: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
74a0: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
74b0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
74c0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
74d0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
74e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
74f0: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
7500: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
7510: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
7520: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
7530: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
7540: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
7550: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
7560: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
7570: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
7580: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
7590: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
75a0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
75b0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
75c0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
75d0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
75e0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
75f0: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
7600: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
7610: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
7620: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7630: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
7640: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
7650: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
7660: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
7670: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
7680: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
7690: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
76a0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
76b0: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
76c0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
76d0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
76e0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
76f0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
7700: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7710: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
7720: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
7730: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
7740: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
7750: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
7760: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
7770: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
7780: 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  \.  btreeParseCe
7790: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
77a0: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
77b0: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
77c0: 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  o)).static void 
77d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
77e0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
77f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7800: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7810: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
7820: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7830: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
7840: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
7850: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
7860: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
7870: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
7880: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
7890: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
78a0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
78b0: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
78c0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
78d0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
78e0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
78f0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
7900: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
7910: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
7920: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
7930: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
7940: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
7950: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
7960: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
7970: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
7980: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
7990: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
79a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
79b0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
79c0: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
79d0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
79e0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
79f0: 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e  = &pCell[pPage->
7a00: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
7a10: 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66   u32 nSize;..#if
7a20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
7a30: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
7a40: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
7a50: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7a60: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
7a70: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
7a80: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
7a90: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
7aa0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
7ab0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
7ac0: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
7ad0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
7ae0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
7af0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
7b00: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
7b10: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
7b20: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
7b30: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
7b40: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
7b50: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
7b60: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
7b70: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
7b80: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
7b90: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
7ba0: 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  ey ){.    u8 *pE
7bb0: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  nd;.    if( pPag
7bc0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
7bd0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
7be0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7bf0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  nSize);.    }els
7c00: 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  e{.      nSize =
7c10: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
7c20: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
7c30: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
7c40: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
7c50: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
7c60: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
7c70: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
7c80: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
7c90: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
7ca0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
7cb0: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
7cc0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
7cd0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
7ce0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
7cf0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
7d00: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
7d10: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
7d20: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20  else{.    pIter 
7d30: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
7d40: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
7d50: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  }..  testcase( n
7d60: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
7d70: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
7d80: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7d90: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7da0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
7db0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
7dc0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7dd0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7de0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
7df0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
7e00: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
7e10: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
7e20: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
7e30: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
7e40: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
7e50: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
7e60: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
7e70: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
7e80: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
7e90: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7ea0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
7eb0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
7ec0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20     nSize += 4;. 
7ed0: 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75   }.  nSize += (u
7ee0: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
7ef0: 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69  l);..  /* The mi
7f00: 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  nimum size of an
7f10: 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65  y cell is 4 byte
7f20: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a  s. */.  if( nSiz
7f30: 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  e<4 ){.    nSize
7f40: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 4;.  }..  ass
7f50: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
7f60: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20  ginfo.nSize );. 
7f70: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
7f80: 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ze;.}.#ifndef ND
7f90: 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20  EBUG.static u16 
7fa0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
7fb0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7fc0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
7fd0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
7fe0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
7ff0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
8000: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
8010: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
8020: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8030: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8040: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8050: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8060: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
8070: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
8080: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
8090: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
80a0: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
80b0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
80c0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
80d0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
80e0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
80f0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
8100: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
8110: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
8120: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8130: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8140: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8150: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
8160: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
8170: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
8180: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
8190: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
81a0: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
81b0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
81c0: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
81d0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
81e0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
81f0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
8200: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
8210: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
8220: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8230: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8240: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8250: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
8260: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
8270: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
8280: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
8290: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
82a0: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
82b0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
82c0: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
82d0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
82e0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
82f0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
8300: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
8310: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8320: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8330: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8340: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8350: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8380: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
83b0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
83c0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
83e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
83f0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
8400: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
8410: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8420: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8430: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8450: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
8460: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
8470: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
8480: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
8490: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
84a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
84b0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
84c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
84d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
84e0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
84f0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
8500: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
8510: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8520: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8530: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8540: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8550: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8560: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
8570: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
8580: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
8590: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
85a0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
85b0: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
85c0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
85d0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
85e0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
85f0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
8600: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
8610: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
8620: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8630: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8640: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8650: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8660: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
8670: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8680: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8690: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
86a0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
86b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
86c0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
86d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
86e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
86f0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8700: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8710: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8720: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8730: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8740: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8750: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8760: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8770: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8780: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8790: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
87a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
87b0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
87c0: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
87d0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
87e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
87f0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
8800: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8810: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8820: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8830: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8840: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8850: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8860: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8870: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8880: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8890: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
88a0: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
88b0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
88c0: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
88d0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
88e0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
88f0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8900: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8910: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8920: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8930: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8940: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8950: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8960: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8970: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8980: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8990: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
89a0: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
89b0: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
89c0: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
89d0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
89e0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
89f0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8a00: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8a10: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8a20: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8a30: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8a40: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8a50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8a60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8a70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8a80: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8a90: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8aa0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8ab0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8ac0: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8ad0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8ae0: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8af0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8b00: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8b10: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8b20: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8b30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8b40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8b50: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8b60: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8b70: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8b80: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8b90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8ba0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8bb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8bc0: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8bd0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8be0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8bf0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8c00: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8c10: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8c20: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
8c30: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8c40: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8c50: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
8c60: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
8c70: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
8c80: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
8c90: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
8ca0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
8cb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
8cc0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
8cd0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
8ce0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
8cf0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
8d00: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
8d10: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
8d20: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
8d30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8d40: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
8d50: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
8d60: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
8d70: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
8d80: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
8d90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8da0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
8db0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8dc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
8dd0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
8de0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
8df0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
8e00: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
8e10: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
8e20: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
8e30: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
8e40: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
8e50: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
8e60: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
8e70: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
8e80: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
8e90: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
8ea0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
8eb0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
8ec0: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
8ed0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
8ee0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
8ef0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
8f00: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
8f10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
8f20: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
8f30: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
8f40: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
8f50: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
8f60: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
8f70: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
8f80: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
8f90: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
8fa0: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
8fb0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
8fc0: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
8fd0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
8fe0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
8ff0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
9000: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
9010: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
9020: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9030: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9040: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9060: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
9070: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9080: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
9090: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
90a0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
90b0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
90c0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
90d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
90e0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
90f0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
9100: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
9110: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9120: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9130: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9160: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9170: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
9180: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
91b0: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
91c0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
91d0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
91e0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
91f0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
9200: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
9210: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
9220: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9230: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9240: 64 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  de */.  .  asser
9250: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
9260: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
9270: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9280: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9290: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
92a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
92b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
92c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
92d0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
92e0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
92f0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9300: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9310: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9320: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9330: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
9340: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9350: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9360: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9370: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9380: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9390: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
93a0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
93b0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
93c0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
93d0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
93e0: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
93f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9400: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
9410: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
9420: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9430: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9440: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9450: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9460: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9470: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9480: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9490: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
94a0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
94b0: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
94c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
94d0: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
94e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
94f0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
9500: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
9510: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
9520: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
9530: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
9540: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9550: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9560: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9570: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9580: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9590: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
95a0: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
95b0: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
95c0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
95d0: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
95e0: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
95f0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
9600: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
9610: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
9620: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
9630: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
9640: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9650: 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a  a[pc+2]);     /*
9660: 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73 6c   Size of free sl
9670: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
9680: 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20  size>=nByte ){. 
9690: 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73         int x = s
96a0: 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20  ize - nByte;.   
96b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
96c0: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==4 );.        t
96d0: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
96e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c 34  .        if( x<4
96f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9700: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
9710: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
9720: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
9730: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
9740: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
9750: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
9760: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
9770: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
9780: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
9790: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
97a0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
97b0: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
97c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
97d0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
97e0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
97f0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
9800: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
9810: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
9820: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
9830: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
9840: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
9850: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
9860: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
9870: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
9880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
9890: 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20  Idx = pc + x;.  
98a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
98b0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
98c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
98d0: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
98e0: 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  re there is enou
98f0: 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65 20  gh space in the 
9900: 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a 20  gap to satisfy. 
9910: 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   ** the allocati
9920: 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65 66  on.  If not, def
9930: 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  ragment..  */.  
9940: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
9950: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
9960: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
9970: 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  top ){.    rc = 
9980: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
9990: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
99a0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
99b0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
99c0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
99d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
99e0: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
99f0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
9a00: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
9a10: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
9a20: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
9a30: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
9a40: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
9a50: 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20  nt area..  */.  
9a60: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
9a70: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9a80: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 2a  dr+5], top);.  *
9a90: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
9aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9ac0: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
9ad0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
9ae0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
9af0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
9b00: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
9b10: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
9b20: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
9b30: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
9b40: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
9b50: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
9b60: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
9b70: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
9b80: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
9b90: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
9ba0: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
9bb0: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
9bc0: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
9bd0: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
9be0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9bf0: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
9c00: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
9c10: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
9c20: 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20    int iLast;    
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70      /* Largest p
9c50: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
9c60: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e  k offset */.  un
9c70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9c80: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9c90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
9ca0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
9cb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9cc0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9cd0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9ce0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
9cf0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
9d00: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
9d10: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
9d20: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
9d30: 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70   size)<=pPage->p
9d40: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
9d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9d60: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9d70: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9d80: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
9d90: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
9da0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
9db0: 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66   is 4 */..#ifdef
9dc0: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
9dd0: 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77  ELETE.  /* Overw
9de0: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
9df0: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
9e00: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53 45 43  ros when the SEC
9e10: 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a  URE_DELETE .  **
9e20: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
9e30: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
9e40: 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  me */.  memset(&
9e50: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
9e60: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  size);.#endif.. 
9e70: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
9e80: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
9e90: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
9ea0: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65  reeblocks.  Note
9eb0: 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20   that.  ** even 
9ec0: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
9ed0: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
9ee0: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
9ef0: 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62  itPage(),.  ** b
9f00: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64  treeInitPage() d
9f10: 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  id not detect ov
9f20: 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20  erlapping cells 
9f30: 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  or.  ** freebloc
9f40: 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70  ks that overlapp
9f50: 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20  ed cells.   Nor 
9f60: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77  does it detect w
9f70: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  hen the.  ** cel
9f80: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65  l content area e
9f90: 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65  xceeds the value
9fa0: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
9fb0: 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20  der.  If these. 
9fc0: 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61   ** situations a
9fd0: 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65  rise, then subse
9fe0: 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65  quent insert ope
9ff0: 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f  rations might co
a000: 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66  rrupt.  ** the f
a010: 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20  reelist.  So we 
a020: 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  do need to check
a030: 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20   for corruption 
a040: 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20  while scanning. 
a050: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
a060: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
a070: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a080: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a090: 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61  1;.  iLast = pPa
a0a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a0b0: 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72  ize - 4;.  asser
a0c0: 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20  t( start<=iLast 
a0d0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  );.  while( (pbe
a0e0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a0f0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61  data[addr]))<sta
a100: 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29  rt && pbegin>0 )
a110: 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  {.    if( pbegin
a120: 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  <addr+4 ){.     
a130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a140: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a150: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62   }.    addr = pb
a160: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  egin;.  }.  if( 
a170: 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a  pbegin>iLast ){.
a180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a190: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a1a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
a1b0: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
a1c0: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
a1d0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
a1e0: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
a1f0: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
a200: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
a210: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
a220: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
a230: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
a240: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75  Page->nFree + (u
a250: 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  16)size;..  /* C
a260: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
a270: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
a280: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a290: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a2a0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a2b0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
a2c0: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
a2d0: 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73  psize, x;.    as
a2e0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
a2f0: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
a300: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
a310: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
a320: 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d  4 );.    pnext =
a330: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a340: 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73  pbegin]);.    ps
a350: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
a360: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
a370: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20  .    if( pbegin 
a380: 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70  + psize + 3 >= p
a390: 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20  next && pnext>0 
a3a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61  ){.      int fra
a3b0: 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65  g = pnext - (pbe
a3c0: 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20  gin+psize);.    
a3d0: 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c    if( (frag<0) |
a3e0: 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74  | (frag>(int)dat
a3f0: 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20  a[hdr+7]) ){.   
a400: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a410: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
a430: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75  ata[hdr+7] -= (u
a440: 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20  8)frag;.      x 
a450: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a460: 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20  [pnext]);.      
a470: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
a480: 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20  begin], x);.    
a490: 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65    x = pnext + ge
a4a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
a4b0: 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b  xt+2]) - pbegin;
a4c0: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
a4d0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
a4e0: 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   x);.    }else{.
a4f0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65        addr = pbe
a500: 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  gin;.    }.  }..
a510: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
a520: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65   content area be
a530: 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65  gins with a free
a540: 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74  block, remove it
a550: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b  . */.  if( data[
a560: 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+1]==data[hdr
a570: 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b  +5] && data[hdr+
a580: 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20  2]==data[hdr+6] 
a590: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a  ){.    int top;.
a5a0: 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74      pbegin = get
a5b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a5c0: 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1]);.    memcpy(
a5d0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64  &data[hdr+1], &d
a5e0: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b  ata[pbegin], 2);
a5f0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
a600: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a610: 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  ) + get2byte(&da
a620: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
a630: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
a640: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
a650: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
a660: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
a670: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
a680: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
a690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a6a0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
a6b0: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
a6c0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a6d0: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
a6e0: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
a6f0: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
a700: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
a710: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
a720: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
a730: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
a740: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
a750: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
a760: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
a770: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
a780: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
a790: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
a7a0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
a7b0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
a7c0: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
a7d0: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
a7e0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
a7f0: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
a800: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
a810: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
a820: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
a830: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
a840: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
a850: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
a860: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
a870: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
a880: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
a890: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a8a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
a8b0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
a8c0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
a8d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a8e0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a8f0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a900: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
a910: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
a920: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
a930: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
a940: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
a950: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
a960: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
a970: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
a980: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
a990: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
a9a0: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
a9b0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
a9c0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
a9d0: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
a9e0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
a9f0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
aa00: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
aa10: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
aa20: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
aa30: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
aa40: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
aa50: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
aa60: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
aa70: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
aa80: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
aa90: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
aaa0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
aab0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
aac0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
aad0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
aae0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
aaf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ab00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
ab10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ab20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
ab30: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
ab40: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
ab50: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
ab60: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
ab70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
ab80: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
ab90: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
aba0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
abb0: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
abc0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
abd0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
abe0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
abf0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
ac00: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
ac10: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
ac20: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
ac30: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
ac40: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
ac50: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
ac60: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
ac70: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
ac80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ac90: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65  btreeInitPage(Me
aca0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a  mPage *pPage){..
acb0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
acc0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
acd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ace0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
acf0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
ad00: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
ad10: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
ad20: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
ad30: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ad40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
ad50: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
ad60: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
ad70: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
ad80: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
ad90: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
ada0: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
adb0: 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66  DbPage) );..  if
adc0: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
add0: 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20   ){.    u16 pc; 
ade0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
adf0: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
ae00: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
ae10: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
ae20: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
ae30: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
ae40: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
ae50: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
ae60: 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
ae70: 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
ae80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
ae90: 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
aea0: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
aeb0: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
aec0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31  ucture */.    u1
aed0: 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  6 usableSize;   
aee0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
aef0: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
af00: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75  ch page */.    u
af10: 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  16 cellOffset;  
af20: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
af30: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
af40: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
af50: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  nter */.    u16 
af60: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
af70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
af80: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
af90: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
afa0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
afb0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
afc0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
afd0: 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74   area */.    int
afe0: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
aff0: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
b000: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
b010: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
b020: 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74     int iCellLast
b030: 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f  ;     /* Last po
b040: 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  ssible cell or f
b050: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
b060: 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50  */..    pBt = pP
b070: 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68  age->pBt;..    h
b080: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b090: 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20  ffset;.    data 
b0a0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b0b0: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
b0c0: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
b0d0: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
b0e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b0f0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
b100: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
b110: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
b120: 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20  ize<=32768 );.  
b130: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
b140: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
b150: 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e - 1;.    pPage
b160: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
b170: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
b180: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
b190: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
b1a0: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
b1b0: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
b1c0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
b1d0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
b1e0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b1f0: 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ]);.    pPage->n
b200: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
b210: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
b220: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
b230: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
b240: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
b250: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
b260: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
b270: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
b280: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
b290: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b2a0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b2b0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
b2c0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
b2d0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a  X_CELL(pBt) );..
b2e0: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d      /* A malform
b2f0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
b300: 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 65   might cause use
b310: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
b320: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
b330: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
b340: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
b350: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
b360: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
b370: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
b380: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
b390: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
b3a0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
b3b0: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
b3c0: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
b3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
b3e0: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
b3f0: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
b400: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
b410: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
b420: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
b430: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
b440: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
b450: 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  - 4;.#if defined
b460: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
b470: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
b480: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
b490: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b4a0: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
b4b0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b4c0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
b4d0: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
b4e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
b4f0: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
b500: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
b510: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
b520: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b530: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
b540: 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
b550: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
b560: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
b570: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b580: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
b590: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
b5a0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b5b0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
b5c0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b5d0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b5e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
b5f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b600: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b610: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
b620: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
b630: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
b640: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b650: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
b660: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
b670: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
b680: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
b690: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b6a0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b6c0: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
b6d0: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
b6e0: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65  st++;.    }  .#e
b6f0: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ndif..    /* Com
b700: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
b710: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
b720: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
b730: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b740: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
b750: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
b760: 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69  ] + top;.    whi
b770: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
b780: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
b790: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
b7a0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
b7b0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
b7c0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
b7d0: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
b7e0: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
b7f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b800: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
b810: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
b820: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
b830: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
b840: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b850: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
b860: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
b870: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
b880: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
b890: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
b8a0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
b8b0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
b8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
b8d0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
b8e0: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
b8f0: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
b900: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
b910: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
b920: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
b930: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
b940: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
b950: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
b960: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
b970: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
b980: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
b990: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
b9a0: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
b9b0: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
b9c0: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
b9d0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
b9e0: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
b9f0: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
ba00: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
ba10: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
ba20: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
ba30: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
ba40: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
ba50: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
ba60: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
ba70: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
ba80: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
ba90: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
baa0: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
bab0: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
bac0: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
bad0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
bae0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
baf0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
bb00: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
bb10: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2d 20 69  Free = nFree - i
bb20: 43 65 6c 6c 46 69 72 73 74 3b 0a 20 20 20 20 70  CellFirst;.    p
bb30: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
bb40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
bb50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bb60: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
bb70: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
bb80: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
bb90: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
bba0: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
bbb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bbc0: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
bbd0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
bbe0: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
bbf0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
bc00: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
bc10: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
bc20: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
bc30: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
bc40: 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
bc50: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
bc60: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
bc70: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
bc80: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
bc90: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
bca0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
bcb0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
bcc0: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
bcd0: 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
bce0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
bcf0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
bd00: 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
bd10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bd20: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
bd30: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
bd40: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
bd50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
bd60: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
bd70: 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61  ;.  /*memset(&da
bd80: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
bd90: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
bda0: 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72  r);*/.  data[hdr
bdb0: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
bdc0: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
bdd0: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
bde0: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30  TF_LEAF)==0 ?1:0
bdf0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
be00: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
be10: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
be20: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
be30: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
be40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
be50: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
be60: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
be70: 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64  - first;.  decod
be80: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
be90: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68  ags);.  pPage->h
bea0: 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a  drOffset = hdr;.
beb0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
bec0: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
bed0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
bee0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
bef0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
bf00: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
bf10: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70  ze<=32768 );.  p
bf20: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
bf30: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
bf40: 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65   1;.  pPage->nCe
bf50: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
bf60: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
bf70: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
bf80: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
bf90: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
bfa0: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
bfb0: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
bfc0: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
bfd0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
bfe0: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
bff0: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
c000: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
c010: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
c020: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
c030: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
c040: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c050: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
c060: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
c070: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c080: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
c090: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
c0a0: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
c0b0: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
c0c0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
c0d0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c0e0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
c0f0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
c100: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
c110: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
c120: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
c130: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
c140: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
c150: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
c160: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
c170: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
c180: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
c190: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
c1a0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
c1b0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
c1c0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
c1d0: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
c1e0: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
c1f0: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
c200: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
c210: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
c220: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
c230: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
c240: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
c250: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
c260: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
c270: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
c280: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
c290: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
c2a0: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
c2b0: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
c2c0: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
c2d0: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
c2e0: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
c2f0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
c300: 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
c310: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
c320: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
c330: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
c340: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
c350: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
c360: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
c370: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
c380: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
c390: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
c3a0: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
c3b0: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
c3c0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
c3d0: 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
c3e0: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
c3f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
c400: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
c410: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c420: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c430: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
c440: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
c450: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
c460: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
c470: 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f  *)&pDbPage, noCo
c480: 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ntent);.  if( rc
c490: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c4a0: 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
c4b0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
c4c0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
c4d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
c4e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c4f0: 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
c500: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
c510: 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
c520: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
c530: 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
c540: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c550: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
c560: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
c570: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
c580: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
c590: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
c5a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
c5b0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
c5c0: 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
c5d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
c5e0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
c5f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
c600: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c610: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c620: 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
c630: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
c640: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
c650: 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
c660: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
c670: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
c680: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
c690: 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
c6a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c6b0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
c6c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
c6d0: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
c6e0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
c6f0: 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
c700: 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
c710: 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
c720: 74 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72  tatic Pgno pager
c730: 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
c740: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
c750: 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e  nPage = -1;.  in
c760: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
c770: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20  pBt->pPage1 );. 
c780: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c790: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
c7a0: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
c7b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
c7c0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61  SQLITE_OK || nPa
c7d0: 67 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75  ge==-1 );.  retu
c7e0: 72 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a  rn (Pgno)nPage;.
c7f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
c800: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
c810: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
c820: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
c830: 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61  ine.** is just a
c840: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
c850: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
c860: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  rate calls to.**
c870: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
c880: 61 6e 64 20 62 74 72 65 65 49 6e 69 74 50 61 67  and btreeInitPag
c890: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
c8a0: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
c8b0: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
c8c0: 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Bt,          /* 
c8d0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
c8e0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c8f0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c900: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c910: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
c920: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20  mPage **ppPage  
c930: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
c940: 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
c950: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
c960: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
c970: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
c980: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c990: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
c9a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
c9b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c9c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c9d0: 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20  ; .  }..  /* It 
c9e0: 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63 61 73  is often the cas
c9f0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
ca00: 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72 65 61  we want is alrea
ca10: 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a  dy in cache..  *
ca20: 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69 74 20  * If so, get it 
ca30: 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20  directly.  This 
ca40: 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20 68 61  saves us from ha
ca50: 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  ving to call.  *
ca60: 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  * pagerPagecount
ca70: 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  () to make sure 
ca80: 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e 20 6c  pgno is within l
ca90: 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72 65 73  imits, which res
caa0: 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d  ults.  ** in a m
cab0: 65 61 73 75 72 65 61 62 6c 65 20 70 65 72 66 6f  easureable perfo
cac0: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
cad0: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50  nts..  */.  *ppP
cae0: 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62 74  age = pPage = bt
caf0: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
cb00: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  t, pgno);.  if( 
cb10: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20  pPage ){.    /* 
cb20: 50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  Page is already 
cb30: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
cb40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cb50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
cb60: 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61 63 68  Page not in cach
cb70: 65 2e 20 20 41 63 71 75 69 72 65 20 69 74 2e 20  e.  Acquire it. 
cb80: 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
cb90: 20 70 67 6e 6f 3d 3d 70 61 67 65 72 50 61 67 65   pgno==pagerPage
cba0: 63 6f 75 6e 74 28 70 42 74 29 20 29 3b 0a 20 20  count(pBt) );.  
cbb0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72    if( pgno>pager
cbc0: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
cbd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
cbe0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
cbf0: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72  PT; .    }.    r
cc00: 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
cc10: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
cc20: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
cc30: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cc40: 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50      pPage = *ppP
cc50: 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  age;.  }.  if( !
cc60: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
cc70: 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
cc80: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
cc90: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
cca0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ccb0: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
ccc0: 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  );.    *ppPage =
ccd0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
cce0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
ccf0: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
cd00: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
cd10: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
cd20: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
cd30: 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
cd40: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
cd50: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
cd60: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
cd70: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
cd80: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cd90: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
cda0: 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
cdb0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67  ageRefcount(pPag
cdc0: 65 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b  e->pDbPage)>1 );
cdd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
cde0: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
cdf0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ce00: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
ce10: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
ce20: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
ce30: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
ce40: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61  *)pPage );.    a
ce50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ce60: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
ce70: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
ce80: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
ce90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cea0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
ceb0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
cec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
ced0: 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44  rUnref(pPage->pD
cee0: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
cef0: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
cf00: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
cf10: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
cf20: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
cf30: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
cf40: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
cf50: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
cf60: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
cf70: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
cf80: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
cf90: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
cfa0: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
cfb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
cfc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
cfd0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
cfe0: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
cff0: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
d000: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
d010: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
d020: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
d030: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
d040: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
d050: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
d060: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
d070: 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
d080: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
d090: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
d0a0: 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
d0b0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d0c0: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
d0d0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
d0e0: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
d0f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d100: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d110: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d120: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
d130: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
d140: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d150: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
d160: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
d170: 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
d180: 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
d190: 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
d1a0: 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
d1b0: 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
d1c0: 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
d1d0: 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
d1e0: 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
d1f0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
d200: 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
d210: 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
d220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d230: 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
d240: 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
d250: 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
d260: 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
d270: 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
d280: 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
d290: 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
d2a0: 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
d2b0: 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
d2c0: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
d2d0: 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
d2e0: 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
d2f0: 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
d300: 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
d310: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
d320: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
d330: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
d340: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
d350: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
d360: 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
d370: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
d380: 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
d390: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
d3a0: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
d3b0: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
d3c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d3d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d3e0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
d3f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
d400: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
d410: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
d420: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
d430: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
d440: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
d450: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
d460: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
d470: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
d480: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
d490: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
d4a0: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
d4b0: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
d4c0: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
d4d0: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
d4e0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
d4f0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
d500: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
d510: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
d520: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
d530: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
d540: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
d550: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
d560: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
d570: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
d580: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
d590: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  osed..**.** If t
d5a0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
d5b0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
d5c0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
d5d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
d5e0: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
d5f0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
d600: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
d610: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
d620: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
d630: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
d640: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
d650: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
d660: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
d670: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d680: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
d690: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
d6a0: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
d6b0: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
d6c0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
d6d0: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
d6e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
d6f0: 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
d700: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
d710: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
d720: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
d730: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
d740: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
d750: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
d760: 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
d770: 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
d780: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
d790: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
d7a0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
d7b0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
d7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
d7d0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
d7e0: 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
d7f0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
d800: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
d810: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
d820: 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ) */.){.  sqlite
d830: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
d840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d850: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
d860: 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
d870: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
d880: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d890: 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
d8a0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
d8b0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
d8e0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
d8f0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
d900: 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
d910: 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
d920: 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
d930: 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
d940: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d960: 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
d970: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
d980: 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
d9b0: 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
d9c0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
d9d0: 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
d9e0: 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
d9f0: 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
da00: 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65  tent */..  /* Se
da10: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
da20: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
da30: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
da40: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
da50: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
da60: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
da70: 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20  se. This symbol 
da80: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
da90: 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20   if.  ** either 
daa0: 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  of the shared-da
dab0: 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d  ta or autovacuum
dac0: 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f   features are co
dad0: 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74  mpiled .  ** int
dae0: 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20  o the library.. 
daf0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
db00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
db10: 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64  RED_CACHE) || !d
db20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
db30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20  IT_AUTOVACUUM). 
db40: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
db50: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
db60: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
db70: 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a  db = 0;.  #else.
db80: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
db90: 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  Memdb = zFilenam
dba0: 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69  e && !strcmp(zFi
dbb0: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
dbc0: 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65  :");.  #endif.#e
dbd0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
dbe0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
dbf0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dc00: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
dc10: 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62   );..  pVfs = db
dc20: 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71  ->pVfs;.  p = sq
dc30: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
dc40: 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
dc50: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
dc60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
dc70: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  MEM;.  }.  p->in
dc80: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
dc90: 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
dca0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
dcb0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
dcc0: 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  HE.  p->lock.pBt
dcd0: 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f  ree = p;.  p->lo
dce0: 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23  ck.iTable = 1;.#
dcf0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
dd00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
dd10: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
dd20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
dd30: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
dd40: 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  /*.  ** If this 
dd50: 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69  Btree is a candi
dd60: 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20  date for shared 
dd70: 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69  cache, try to fi
dd80: 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74  nd an.  ** exist
dd90: 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a  ing BtShared obj
dda0: 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20  ect that we can 
ddb0: 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a  share with.  */.
ddc0: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30    if( isMemdb==0
ddd0: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26   && zFilename &&
dde0: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
ddf0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
de00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
de10: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
de20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
de30: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
de40: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
de50: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
de60: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
de70: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
de80: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
de90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
dea0: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
deb0: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
dec0: 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   1;.      db->fl
ded0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
dee0: 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20  aredCache;.     
def0: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
df00: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
df10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
df20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
df30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
df40: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
df50: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
df60: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
df70: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
df80: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
df90: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
dfa0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
dfb0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
dfc0: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
dfd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
dfe0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
dff0: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
e000: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
e010: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
e020: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
e030: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
e040: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e050: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
e060: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
e070: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e080: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e090: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
e0a0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
e0b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e0c0: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
e0d0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
e0e0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
e0f0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
e100: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
e110: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
e120: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
e130: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
e140: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
e150: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
e160: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
e170: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
e180: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
e190: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
e1a0: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
e1b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
e1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
e1d0: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
e1e0: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
e1f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
e200: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e210: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
e220: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
e230: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e240: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
e250: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e260: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
e270: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e280: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e290: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
e2a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
e2b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
e2c0: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
e2d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
e2e0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
e2f0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
e300: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
e310: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e320: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
e340: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e350: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
e360: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
e370: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e380: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
e390: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
e3a0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
e3b0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
e3c0: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
e3d0: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
e3e0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
e3f0: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
e400: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
e410: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
e420: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
e430: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
e440: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
e450: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
e460: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
e470: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
e480: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
e490: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
e4a0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
e4b0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
e4c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
e4d0: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
e4e0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
e4f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
e500: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
e510: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
e520: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
e530: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
e540: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
e550: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
e560: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
e570: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
e580: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
e590: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
e5a0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
e5b0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
e5c0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
e5d0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
e5e0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
e5f0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
e600: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
e610: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
e620: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
e630: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
e640: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
e650: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
e660: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
e670: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
e680: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
e690: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
e6a0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
e6b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
e6c0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e6d0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
e6e0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
e6f0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
e700: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
e710: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
e720: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
e750: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
e760: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
e770: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e790: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
e7a0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
e7b0: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
e7c0: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
e7d0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
e7e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e7f0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
e800: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
e810: 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
e820: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
e830: 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
e840: 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
e850: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
e860: 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
e870: 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
e880: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e890: 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50  Reiniter(pBt->pP
e8a0: 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74  ager, pageReinit
e8b0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  );.    pBt->pCur
e8c0: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
e8d0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
e8e0: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
e8f0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
e900: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
e910: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
e920: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
e930: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
e940: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
e950: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
e960: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
e970: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
e980: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
e990: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
e9a0: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
e9b0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
e9c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
e9d0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e9e0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e9f0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
ea00: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
ea10: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
ea20: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
ea30: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
ea40: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
ea50: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
ea60: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
ea70: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
ea80: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
ea90: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
eaa0: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
eab0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
eac0: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
ead0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
eae0: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
eaf0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
eb00: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
eb10: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
eb20: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
eb30: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
eb40: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
eb50: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
eb60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
eb70: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
eb80: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
eb90: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
eba0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
ebb0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
ebc0: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
ebd0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
ebe0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
ebf0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
ec00: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
ec10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ec20: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
ec30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ec40: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
ec50: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
ec60: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
ec70: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
ec80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ec90: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
eca0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ecb0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
ecc0: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
ecd0: 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
ece0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
ecf0: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
ed00: 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
ed10: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
ed20: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
ed30: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
ed40: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
ed50: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
ed60: 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
ed70: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
ed80: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
ed90: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
eda0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
edb0: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
edc0: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
edd0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
ede0: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
edf0: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
ee00: 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
ee10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ee20: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ee30: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
ee40: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
ee50: 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
ee60: 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
ee70: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
ee80: 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
ee90: 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
eea0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
eeb0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
eec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
eed0: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
eee0: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
eef0: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
ef00: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
ef10: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
ef20: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
ef30: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
ef40: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
ef50: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
ef60: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
ef70: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
ef80: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
ef90: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
efa0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
efb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
efc0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
efd0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
efe0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
eff0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
f000: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
f010: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
f020: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
f030: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f040: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f050: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
f060: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
f070: 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
f080: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f090: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
f0a0: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
f0b0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f0c0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
f0d0: 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
f0e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f0f0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
f100: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
f110: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f120: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f130: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
f140: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
f150: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
f160: 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
f170: 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
f180: 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
f190: 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
f1a0: 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
f1b0: 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
f1c0: 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
f1d0: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
f1e0: 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
f1f0: 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
f200: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
f210: 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
f220: 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
f230: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
f240: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
f250: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f260: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f270: 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
f280: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f290: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
f2a0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
f2b0: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
f2c0: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
f2d0: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
f2e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
f2f0: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
f300: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
f310: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
f320: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
f330: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
f340: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
f350: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f360: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
f370: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
f380: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
f390: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f3a0: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
f3b0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
f3c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
f3d0: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
f3e0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
f3f0: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
f400: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
f410: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
f420: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
f430: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
f440: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f450: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
f460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f480: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f490: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
f4a0: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
f4b0: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
f4c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
f4d0: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
f4e0: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
f4f0: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
f500: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
f510: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f520: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
f530: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
f540: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
f550: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74  0;.  }.  if( mut
f560: 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
f570: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f580: 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
f590: 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
f5a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
f5b0: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
f5c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f5d0: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
f5e0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
f5f0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
f600: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
f610: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
f620: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
f630: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
f640: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
f650: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
f660: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
f670: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
f680: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
f690: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
f6a0: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
f6b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f6c0: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
f6d0: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
f6e0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
f6f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f700: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
f710: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
f720: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
f730: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
f740: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
f750: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
f760: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
f770: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
f780: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f790: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f7a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
f7b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f7c0: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
f7d0: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
f7e0: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
f7f0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
f800: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
f810: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
f820: 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
f830: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
f840: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f850: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
f860: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
f870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
f880: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
f890: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f8a0: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
f8b0: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
f8c0: 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
f8d0: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
f8e0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
f8f0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
f900: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
f910: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
f920: 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
f930: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
f940: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
f950: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
f960: 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
f970: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f980: 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
f990: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
f9a0: 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
f9b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f9c0: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
f9d0: 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
f9e0: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
f9f0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
fa00: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
fa10: 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
fa20: 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
fa30: 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
fa40: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
fa50: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
fa60: 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
fa70: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
fa80: 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
fa90: 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
faa0: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
fab0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
fac0: 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
fad0: 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
fae0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
faf0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
fb00: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
fb10: 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
fb20: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
fb30: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
fb40: 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
fb50: 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
fb60: 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
fb70: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
fb80: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
fb90: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
fba0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
fbb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
fbc0: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
fbd0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fbe0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
fbf0: 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
fc00: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
fc10: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
fc20: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
fc30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fc40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
fc50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
fc60: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
fc70: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
fc80: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
fc90: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
fca0: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
fcb0: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
fcc0: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
fcd0: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
fce0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
fcf0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
fd00: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
fd10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
fd20: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
fd30: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
fd40: 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
fd50: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
fd60: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
fd70: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
fd80: 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
fd90: 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
fda0: 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
fdb0: 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
fdc0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
fdd0: 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  k(p);.  sqlite3B
fde0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
fdf0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
fe00: 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
fe10: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
fe20: 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
fe30: 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
fe40: 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
fe50: 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
fe60: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
fe70: 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
fe80: 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
fe90: 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
fea0: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
feb0: 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
fec0: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
fed0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
fee0: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
fef0: 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
ff00: 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
ff10: 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
ff20: 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
ff30: 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
ff40: 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
ff50: 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
ff60: 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
ff70: 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
ff80: 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
ff90: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
ffa0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
ffb0: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
ffc0: 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
ffd0: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
ffe0: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
fff0: 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
10000 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
10010 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
10020 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
10030 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10040 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
10050 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ree(pBt->pSchema
10060 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
10070 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
10080 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
10090 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
100a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
100b0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
100c0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
100d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
100e0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
100f0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
10100 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
10110 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
10120 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
10130 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
10140 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
10150 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
10160 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
10170 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10180 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
10190 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
101a0 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
101b0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
101c0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
101d0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
101e0 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
101f0 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
10200 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
10210 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
10220 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
10230 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
10240 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
10250 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
10260 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
10270 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
10280 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
10290 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
102a0 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
102b0 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
102c0 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
102d0 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
102e0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
102f0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
10300 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
10310 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
10320 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
10330 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
10340 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
10350 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
10360 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
10370 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
10380 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
10390 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
103a0 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
103b0 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
103c0 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
103d0 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
103e0 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
103f0 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
10400 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
10410 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
10420 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
10430 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
10440 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
10450 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
10460 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
10470 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10480 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
10490 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
104a0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
104b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
104c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
104d0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
104e0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
104f0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
10500 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10510 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10520 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10530 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
10540 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
10550 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
10560 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
10570 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
10580 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
10590 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
105a0 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
105b0 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
105c0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
105d0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
105e0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
105f0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
10600 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
10610 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
10620 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
10630 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
10640 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
10650 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
10660 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
10670 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
10680 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
10690 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
106a0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
106b0 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
106c0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
106d0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
106e0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
106f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
10700 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
10710 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
10720 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
10730 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
10740 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
10750 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10760 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
10770 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10780 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10790 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
107a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
107b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
107c0 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
107d0 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
107e0 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
107f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10810 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
10820 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
10830 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
10840 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
10850 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
10860 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
10870 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
10880 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
10890 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
108a0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
108b0 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
108c0 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
108d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
108e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
108f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
10900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10910 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10920 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
10930 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
10940 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
10950 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
10960 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
10970 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
10980 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
10990 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
109a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
109b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
109c0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
109d0 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
109e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
109f0 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  UM)./*.** Change
10a00 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
10a10 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
10a20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
10a30 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
10a40 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
10a50 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
10a60 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
10a70 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
10a80 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
10a90 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
10aa0 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
10ab0 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
10ac0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
10ad0 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
10ae0 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
10af0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
10b00 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
10b10 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
10b20 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
10b30 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
10b40 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
10b50 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
10b60 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
10b70 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
10b80 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
10b90 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
10ba0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
10bb0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
10bc0 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
10bd0 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
10be0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
10bf0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
10c00 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
10c10 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
10c20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10c30 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
10c40 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
10c50 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
10c60 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10c70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
10c80 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
10c90 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
10ca0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
10cb0 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
10cc0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 53 69   then the pageSi
10cd0 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69 73 20  zeFixed flag is 
10ce0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
10cf0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
10d00 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
10d10 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
10d20 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
10d30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
10d40 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
10d50 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
10d60 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
10d70 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
10d80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10d90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10da0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
10db0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
10dc0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
10dd0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
10de0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
10df0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
10e00 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71  eFixed ){.    sq
10e10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10e20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
10e30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
10e40 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
10e50 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
10e60 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
10e70 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
10e80 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
10e90 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
10ea0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
10eb0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
10ec0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
10ed0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
10ee0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
10ef0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
10f00 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
10f10 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
10f20 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
10f30 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
10f40 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
10f50 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
10f60 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
10f70 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65  Size = (u16)page
10f80 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
10f90 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10fa0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10fb0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10fc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
10fd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
10fe0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
10ff0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
11000 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
11010 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
11020 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61  ( iFix ) pBt->pa
11030 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
11040 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11050 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
11070 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
11080 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
11090 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
110a0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
110b0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
110c0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
110d0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
110e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
110f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
11100 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
11110 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
11120 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
11130 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
11140 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
11150 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
11160 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
11170 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
11180 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
11190 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
111a0 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
111b0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
111c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
111d0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
111e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
111f0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
11200 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
11210 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11220 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
11230 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
11240 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
11250 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
11260 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
11270 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
11280 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
11290 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
112a0 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
112b0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
112c0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
112d0 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
112e0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
112f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
11300 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
11310 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
11320 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
11330 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11340 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
11350 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
11360 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
11370 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
11380 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11390 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
113a0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
113b0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
113c0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
113d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
113e0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
113f0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11400 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
11410 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
11420 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
11430 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
11440 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
11450 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
11460 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
11470 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
11480 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
11490 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
114a0 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
114b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
114c0 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
114d0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
114e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
114f0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
11500 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11510 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
11520 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
11530 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
11540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11550 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
11560 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
11570 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
11580 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11590 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
115a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
115b0 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
115c0 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
115d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
115e0 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
115f0 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a  Fixed && (av ?1:
11600 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
11610 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
11620 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
11640 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
11650 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
11660 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
11670 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
11680 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11690 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
116a0 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
116b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
116c0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
116d0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
116e0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
116f0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
11700 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
11710 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
11720 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11730 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
11740 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
11750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11760 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
11770 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
11780 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
11790 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
117a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
117b0 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
117c0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
117d0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
117e0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
117f0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
11800 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
11810 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
11820 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
11830 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
11840 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11850 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
11860 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
11870 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
11880 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
11890 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
118a0 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
118b0 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
118c0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
118d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
118e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
118f0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
11900 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
11910 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
11920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
11930 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
11940 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
11950 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
11960 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
11970 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
11980 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
11990 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
119a0 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
119b0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
119c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
119d0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
119e0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
119f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11a00 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
11a10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11a30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11a40 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
11a50 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
11a60 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
11a70 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
11a80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11a90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
11aa0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
11ab0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
11ac0 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
11ad0 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
11ae0 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
11af0 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
11b00 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  . .  */.  rc = s
11b10 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
11b20 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
11b30 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  , &nPage);.  if(
11b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11b50 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31  {.    goto page1
11b60 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11b70 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e  }else if( nPage>
11b80 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67  0 ){.    int pag
11b90 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75  eSize;.    int u
11ba0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
11bb0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
11bc0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
11bd0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
11be0 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
11bf0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
11c00 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
11c10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
11c20 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11c30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
11c40 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
11c50 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
11c60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
11c70 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
11c80 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
11c90 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
11ca0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
11cb0 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
11cc0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
11cd0 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
11ce0 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
11cf0 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
11d00 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
11d10 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
11d20 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
11d30 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
11d40 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
11d50 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
11d60 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
11d70 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
11d80 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
11d90 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
11da0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
11db0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
11dc0 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
11dd0 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
11de0 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
11df0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
11e00 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
11e10 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
11e20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
11e30 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
11e40 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
11e50 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61  geSize)!=0 || pa
11e60 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20  geSize<512 ||.  
11e70 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41        (SQLITE_MA
11e80 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36  X_PAGE_SIZE<3276
11e90 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51  8 && pageSize>SQ
11ea0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
11eb0 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ZE).    ){.     
11ec0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11ed0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
11ee0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11ef0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11f00 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
11f10 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
11f20 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
11f30 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
11f40 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
11f50 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
11f60 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
11f70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11f80 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
11f90 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
11fa0 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
11fb0 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
11fc0 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
11fd0 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
11fe0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
11ff0 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
12000 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
12010 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
12020 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
12030 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
12040 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
12050 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
12060 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
12070 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
12080 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
12090 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
120a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
120b0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
120c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
120d0 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
120e0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
120f0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
12100 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
12110 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
12120 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12130 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
12140 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
12150 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
12160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
12190 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
121a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
121b0 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
121c0 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
121d0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
121e0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
121f0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
12200 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
12210 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
12220 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
12230 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
12240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12250 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
12260 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
12270 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
12280 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
12290 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
122a0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
122b0 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
122c0 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
122d0 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
122e0 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
122f0 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
12300 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
12310 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
12320 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
12330 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
12340 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
12350 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
12360 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
12370 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
12380 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
12390 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
123a0 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
123b0 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
123c0 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
123d0 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
123e0 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
123f0 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
12400 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
12410 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
12420 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
12430 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
12440 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
12450 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
12460 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
12470 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
12480 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
12490 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61  2-byte poiner, a
124a0 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
124b0 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
124c0 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
124d0 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
124e0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
124f0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
12500 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
12510 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
12520 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
12530 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
12540 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
12550 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
12560 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
12570 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
12580 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
12590 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75  maxLeaf = pBt->u
125a0 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a  sableSize - 35;.
125b0 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
125c0 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
125d0 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
125e0 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  3;.  assert( pBt
125f0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
12600 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
12610 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
12620 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
12630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12640 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
12650 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
12660 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
12670 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
12680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12690 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
126a0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
126b0 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
126c0 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
126d0 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
126e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
126f0 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
12700 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
12710 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
12720 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
12730 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
12740 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12750 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
12760 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
12770 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
12780 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
12790 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
127a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
127b0 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
127c0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
127d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
127e0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
127f0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
12800 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
12810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12820 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12830 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12840 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74  Cursor==0 || pBt
12850 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
12860 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
12870 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
12880 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
12890 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
128a0 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  1!=0 ){.    asse
128b0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
128c0 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
128d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
128e0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
128f0 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
12900 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12910 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
12920 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12930 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
12940 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
12950 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
12960 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
12970 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
12980 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
12990 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
129a0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
129b0 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
129c0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
129d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
129e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
129f0 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
12a00 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
12a10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12a20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
12a30 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
12a40 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12a50 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
12a60 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
12a70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12a80 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20   || nPage>0 ){. 
12a90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12aa0 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
12ab0 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
12ac0 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
12ad0 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
12ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12af0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
12b00 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
12b10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12b20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
12b30 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
12b40 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
12b50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
12b60 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
12b70 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
12b80 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
12b90 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
12ba0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
12bb0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
12bc0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
12bd0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
12be0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
12bf0 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
12c00 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
12c10 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
12c20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
12c30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
12c40 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
12c50 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
12c60 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
12c70 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
12c80 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
12c90 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
12ca0 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
12cb0 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
12cc0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
12cd0 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
12ce0 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
12cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12d00 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
12d10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
12d20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
12d30 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
12d40 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
12d50 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
12d60 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
12d70 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
12d80 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
12d90 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
12da0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
12db0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
12dc0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
12dd0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
12de0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
12df0 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
12e00 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
12e10 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
12e20 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
12e30 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
12e40 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
12e50 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
12e60 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
12e70 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
12e80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12e90 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
12ea0 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
12eb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
12ec0 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
12ed0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
12ee0 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
12ef0 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
12f00 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
12f10 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
12f20 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
12f30 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
12f40 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
12f50 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
12f60 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
12f70 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
12f80 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
12f90 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
12fa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
12fb0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
12fc0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
12fd0 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
12fe0 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
12ff0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
13000 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
13010 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13020 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
13030 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
13040 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13050 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
13060 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
13070 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
13080 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
13090 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
130a0 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
130b0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
130c0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
130d0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
130e0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
130f0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
13100 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
13110 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
13120 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
13130 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
13140 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
13150 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
13160 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
13170 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
13180 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
13190 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
131a0 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
131b0 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
131c0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
131d0 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
131e0 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
131f0 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
13200 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
13210 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
13220 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
13230 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
13240 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
13250 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
13260 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
13270 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
13280 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
13290 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
132a0 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
132b0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
132c0 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
132d0 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
132e0 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
132f0 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
13300 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
13310 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
13320 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
13330 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
13340 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
13350 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
13360 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
13370 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
13380 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
13390 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
133a0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
133b0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
133c0 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
133d0 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
133e0 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
133f0 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
13400 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
13410 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
13420 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
13430 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
13440 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
13450 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
13460 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
13470 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
13480 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13490 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
134a0 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
134b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
134c0 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
134d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
134e0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
134f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
13500 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13510 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
13520 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
13530 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
13540 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
13550 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
13560 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
13570 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
13580 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
13590 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
135a0 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
135b0 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
135c0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
135d0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
135e0 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
135f0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
13600 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
13610 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
13620 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
13630 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
13640 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
13650 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
13660 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
13670 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64  .  if( pBt->read
13680 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29  Only && wrflag )
13690 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
136a0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
136b0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
136c0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
136d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
136e0 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
136f0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
13700 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
13710 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
13720 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
13730 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
13740 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
13750 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
13760 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
13770 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
13780 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
13790 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
137a0 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
137b0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
137c0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
137d0 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e  E) || pBt->isPen
137e0 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f  ding ){.    pBlo
137f0 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
13800 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
13810 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
13820 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
13830 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
13840 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
13850 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
13860 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
13870 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
13880 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
13890 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
138a0 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
138b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
138c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
138d0 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
138e0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
138f0 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
13900 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
13910 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
13920 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
13930 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
13940 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13950 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
13960 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
13970 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
13980 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
13990 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
139a0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
139b0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
139c0 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
139d0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
139e0 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
139f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
13a00 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
13a10 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
13a20 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
13a30 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
13a40 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
13a50 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
13a60 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
13a70 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 64 6f 20 7b  s_begun;..  do {
13a80 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
13a90 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
13aa0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
13ab0 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
13ac0 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
13ad0 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
13ae0 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
13af0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
13b00 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
13b10 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
13b20 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
13b30 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
13b40 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
13b50 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
13b60 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
13b70 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
13b80 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
13b90 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
13ba0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
13bb0 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
13bc0 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
13bd0 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
13be0 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
13bf0 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
13c00 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
13c10 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
13c20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
13c30 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
13c40 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
13c50 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
13c60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13c70 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
13c80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
13c90 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
13ca0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13cb0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
13cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13ce0 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
13cf0 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
13d00 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
13d10 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
13d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13d30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13d40 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
13d50 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
13d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13d70 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
13d80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13d90 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13da0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
13db0 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
13dc0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
13dd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13de0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
13df0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
13e00 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13e10 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
13e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13e30 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
13e40 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
13e50 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
13e60 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
13e70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13e80 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13e90 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
13ea0 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28  able ){..assert(
13eb0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
13ec0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
13ed0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
13ee0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
13ef0 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
13f00 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
13f10 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
13f20 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
13f30 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
13f40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
13f50 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
13f60 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
13f70 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
13f80 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
13f90 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
13fa0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
13fb0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
13fc0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
13fd0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69  nTrans;.    }.#i
13fe0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13ff0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
14000 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
14010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14020 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
14030 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
14040 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
14050 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
14060 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b   (u8)(wrflag>1);
14070 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14080 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
14090 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
140a0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
140b0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
140c0 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
140d0 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
140e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
140f0 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70  ber of.    ** op
14100 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
14110 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
14120 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
14130 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
14140 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
14150 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  nal is not alrea
14160 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  dy open, then it
14170 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
14180 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
14190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
141a0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
141b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e  pBt->pPager, p->
141c0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b  db->nSavepoint);
141d0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
141e0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
141f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14200 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14210 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
14220 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14230 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
14240 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
14250 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
14260 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
14270 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
14280 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
14290 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
142a0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
142b0 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
142c0 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
142d0 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
142e0 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
142f0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14300 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
14310 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
14320 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
14350 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
14360 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14390 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
143a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
143d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
143e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
143f0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
14400 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
14410 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50  age->isInit;.  P
14420 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
14430 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
14440 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14450 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
14460 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
14470 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
14480 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
14490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
144a0 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69      goto set_chi
144b0 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
144c0 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50    }.  nCell = pP
144d0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
144e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
144f0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
14500 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
14510 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
14520 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
14530 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
14540 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
14550 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
14560 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
14570 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
14580 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
14590 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
145a0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
145b0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
145c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
145d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
145e0 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
145f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
14600 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
14610 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
14620 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
14630 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
14640 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
14650 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
14660 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
14670 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
14680 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
14690 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
146a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
146b0 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
146c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
146d0 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
146e0 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
146f0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
14700 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
14710 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
14720 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
14730 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
14740 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
14750 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
14760 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
14770 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
14780 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
14790 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
147a0 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
147b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
147c0 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
147d0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
147e0 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
147f0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
14800 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
14810 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14830 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
14840 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
14850 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
14860 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
14870 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
14880 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
14890 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
148a0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
148b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
148c0 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
148d0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
148e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
148f0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
14900 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
14910 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
14920 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
14930 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
14940 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14950 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
14960 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
14970 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
14980 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
14990 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
149a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
149b0 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
149c0 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
149d0 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
149e0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
149f0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
14a00 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
14a10 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
14a20 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
14a30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14a40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14a50 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
14a60 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
14a70 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
14a80 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
14a90 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
14aa0 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
14ab0 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
14ac0 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74 50  ..    btreeInitP
14ad0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
14ae0 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
14af0 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
14b00 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
14b10 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
14b20 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
14b30 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
14b40 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
14b50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
14b60 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
14b70 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72  nfo;.        btr
14b80 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
14b90 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
14ba0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
14bb0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
14bc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
14bd0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
14be0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
14bf0 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20  erflow]) ){.    
14c00 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
14c10 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
14c20 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
14c30 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14c40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14c60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
14c70 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
14c80 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
14c90 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
14ca0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
14cb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14cd0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
14ce0 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
14cf0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
14d00 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
14d10 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
14d20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
14d30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
14d40 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
14d50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14d60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14d80 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
14d90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
14da0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
14db0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
14dc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
14dd0 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
14de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14df0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
14e00 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
14e10 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
14e20 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
14e30 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
14e40 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
14e50 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
14e60 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
14e70 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
14e80 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
14e90 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
14ea0 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
14eb0 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
14ec0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
14ed0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
14ee0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
14ef0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
14f00 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
14f10 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
14f20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
14f30 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
14f40 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
14f50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14f60 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
14f70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
14f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
14f90 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
14fa0 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
14fb0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
14fc0 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
14fd0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
14fe0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
14ff0 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
15000 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
15010 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
15020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
15030 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
15040 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
15050 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
15060 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
15070 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
15080 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
15090 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
150a0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
150b0 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
150c0 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
150d0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
150e0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
150f0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
15100 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
15110 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
15120 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
15130 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
15140 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
15150 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
15160 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
15170 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15180 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
15190 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
151a0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
151b0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
151c0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
151d0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
151e0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
151f0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
15200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15210 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
15220 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
15230 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
15240 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
15250 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
15260 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
15270 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
15280 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
15290 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
152a0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
152b0 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
152c0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
152d0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
152e0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
152f0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
15300 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
15310 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
15320 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
15330 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
15340 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
15350 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
15370 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
15380 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
15390 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
153a0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
153b0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
153c0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
153d0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
153e0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
153f0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
15400 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
15410 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
15420 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
15430 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
15440 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
15450 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
15460 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
15470 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
15480 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
15490 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
154a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
154b0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
154c0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
154d0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
154e0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
154f0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
15500 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
15510 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
15520 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
15530 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
15540 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
15550 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
15560 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
15570 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
15580 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
15590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
155a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
155b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
155c0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
155d0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
155e0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
155f0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
15600 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
15610 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
15620 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
15630 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
15640 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
15650 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
15670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15680 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15690 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
156a0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
156b0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
156c0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
156d0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
156e0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
156f0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
15700 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
15710 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
15720 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
15730 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
15740 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
15750 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
15760 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
15770 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
15780 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
157a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
157b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
157c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
157d0 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
157e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
157f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15800 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
15810 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
15820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15830 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
15840 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
15850 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
15860 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
15870 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15880 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
15890 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
158a0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
158b0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
158c0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
158d0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
158e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
158f0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
15900 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
15910 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
15920 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
15930 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
15940 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
15950 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
15960 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
15970 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
15980 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
15990 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
159a0 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
159b0 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
159c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
159d0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
159e0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
159f0 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
15a00 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
15a10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
15a20 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
15a30 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
15a40 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
15a50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
15a60 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
15a70 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
15a80 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
15a90 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
15aa0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
15ab0 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
15ac0 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
15ad0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
15ae0 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
15af0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
15b00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
15b10 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
15b20 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
15b30 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
15b40 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
15b50 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
15b60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
15b70 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
15b80 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
15b90 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
15ba0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
15bb0 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
15bc0 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
15bd0 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
15be0 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
15bf0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
15c00 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
15c10 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
15c20 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
15c30 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
15c40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15c50 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
15c60 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
15c70 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
15c80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15c90 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
15ca0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
15cb0 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
15cc0 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
15cd0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
15ce0 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
15cf0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
15d00 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ) ){.    int rc;
15d10 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
15d20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
15d30 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
15d40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
15d50 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
15d60 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
15d70 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
15d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15d90 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
15da0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
15db0 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
15dc0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
15dd0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
15de0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15df0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15e00 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
15e10 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
15e20 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
15e30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
15e40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
15e50 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
15e60 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
15e70 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
15e80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
15e90 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
15ea0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
15eb0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
15ec0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
15ed0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
15ee0 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
15ef0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
15f00 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
15f10 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
15f20 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
15f30 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
15f40 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
15f50 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
15f60 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
15f70 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
15f80 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
15f90 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
15fa0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
15fb0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
15fc0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
15fd0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
15fe0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
15ff0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
16000 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
16010 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
16020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16040 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
16060 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
16070 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
16080 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
16090 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
160a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
160b0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160d0 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
160e0 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
160f0 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
16100 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
16110 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
16120 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
16130 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
16140 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
16150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16160 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16170 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
16180 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73     /* If nFin is
16190 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
161a0 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
161b0 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
161c0 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
161d0 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
161e0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
161f0 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
16200 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
16210 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
16220 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
16230 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74  if nFin is great
16240 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
16250 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
16260 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
16270 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
16280 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
16290 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
162a0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
162b0 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
162c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
162d0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
162e0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
162f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
16300 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
16310 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
16320 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Pg, 0, 0);.     
16330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
16360 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
16370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16390 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
163a0 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
163b0 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46  e( nFin!=0 && iF
163c0 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
163d0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
163e0 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
163f0 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
16400 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16410 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50  te(pLastPg->pDbP
16420 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
16430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16440 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
16450 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
16460 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
16470 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
16480 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20  g, nFin!=0);.   
16490 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
164a0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
164b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
164c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
164d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
164e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
164f0 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20  ..  if( nFin==0 
16500 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  ){.    iLastPg--
16510 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61  ;.    while( iLa
16520 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
16530 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54  TE_PAGE(pBt)||PT
16540 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16550 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
16560 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
16570 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
16580 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65  g) ){.        Me
16590 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20  mPage *pPg;.    
165a0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72      int rc = btr
165b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
165c0 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29  LastPg, &pPg, 0)
165d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
165e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
165f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16600 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
16610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16620 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
16630 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
16640 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16650 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
16660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16680 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16690 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
166a0 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
166b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
166c0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
166d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73  Bt->pPager, iLas
166e0 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tPg);.  }.  retu
166f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16700 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
16710 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
16720 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
16730 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
16740 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
16750 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
16760 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
16770 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
16780 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
16790 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
167a0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
167b0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
167c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
167d0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
167e0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
167f0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
16800 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
16810 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
16820 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
16830 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
16840 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
16850 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
16860 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
16870 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
16880 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
16890 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
168a0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
168b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
168c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
168d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
168e0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
168f0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
16900 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
16910 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
16920 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16930 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
16940 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
16950 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
16960 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69  pBt);.    rc = i
16970 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
16980 74 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65 63  t, 0, pagerPagec
16990 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a  ount(pBt));.  }.
169a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
169b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
169c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
169d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
169e0 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
169f0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
16a00 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
16a10 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
16a20 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
16a30 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
16a40 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
16a50 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
16a60 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
16a70 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
16a80 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
16a90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16aa0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
16ab0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
16ac0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
16ad0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
16ae0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
16af0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
16b00 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
16b10 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
16b20 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
16b30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16b40 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
16b50 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
16b60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16b70 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
16b80 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
16b90 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
16ba0 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
16bb0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
16bc0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
16bd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16be0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
16bf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
16c00 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
16c10 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
16c20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
16c30 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
16c40 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
16c50 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
16c60 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
16c70 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
16c80 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
16c90 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
16ca0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16cb0 70 61 67 65 73 20 6e 6f 20 74 68 65 20 66 72 65  pages no the fre
16cc0 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 50 67 6e  elist */.    Pgn
16cd0 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20  o nPtrmap;      
16ce0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
16cf0 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
16d00 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
16d10 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
16d20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
16d30 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
16d40 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20      int nEntry; 
16d50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16d60 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
16d70 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
16d80 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  /.    Pgno nOrig
16d90 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
16da0 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65  base size before
16db0 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20   freeing */..   
16dc0 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61   nOrig = pagerPa
16dd0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
16de0 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
16df0 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
16e00 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
16e10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
16e20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
16e30 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
16e40 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
16e50 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
16e60 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
16e70 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
16e80 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
16e90 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
16ea0 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
16eb0 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
16ec0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
16ed0 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
16ee0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
16ef0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
16f00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
16f10 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
16f20 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
16f30 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
16f40 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45  ata[36]);.    nE
16f50 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62  ntry = pBt->usab
16f60 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50  leSize/5;.    nP
16f70 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
16f80 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
16f90 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
16fa0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
16fb0 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20     nFin = nOrig 
16fc0 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
16fd0 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  p;.    if( nOrig
16fe0 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
16ff0 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
17000 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17010 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
17020 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
17030 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
17040 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
17050 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
17060 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
17070 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
17080 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  -;.    }.    if(
17090 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
170a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
170b0 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66  UPT_BKPT;..    f
170c0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
170d0 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
170e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
170f0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
17100 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
17110 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
17120 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
17130 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
17140 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
17150 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
17160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
17170 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72  LITE_OK;.      r
17180 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17190 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
171a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
171b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
171c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
171d0 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
171e0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
171f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
17200 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
17210 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
17220 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
17230 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
17240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
17260 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
17270 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17280 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
17290 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
172a0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
172b0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
172c0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
172d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
172e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
172f0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
17300 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
17310 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
17320 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17330 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
17340 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
17350 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
17360 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
17370 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
17380 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
17390 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
173a0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
173b0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
173c0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
173d0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
173e0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
173f0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
17400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
17410 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
17420 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
17430 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
17440 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
17450 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
17460 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
17470 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
17480 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
17490 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
174a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
174b0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
174c0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
174d0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
174e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
174f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
17500 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
17510 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
17520 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
17530 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
17540 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
17550 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
17560 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
17570 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
17580 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
17590 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
175a0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
175b0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
175c0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
175d0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
175e0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
175f0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
17600 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
17610 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
17620 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
17630 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
17640 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
17650 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
17660 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
17670 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
17680 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
17690 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
176a0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
176b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
176c0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
176d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
176e0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
176f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
17700 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
17710 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
17720 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
17730 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
17740 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
17750 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
17760 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
17770 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
17780 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
17790 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
177a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
177b0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
177c0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
177d0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
177e0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
177f0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
17800 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
17810 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
17820 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
17830 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
17840 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
17850 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
17860 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
17870 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17880 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
17890 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
178a0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
178b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
178c0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
178d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
178e0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
178f0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17900 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
17910 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
17920 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17930 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
17940 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
17950 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
17960 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
17970 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
17980 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17990 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
179a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
179b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
179c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
179d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
179e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
179f0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
17a00 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
17a10 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
17a20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17a30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17a40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
17a50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
17a60 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
17a70 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
17a80 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
17a90 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
17aa0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
17ab0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
17ac0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
17ad0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
17ae0 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
17af0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17b00 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
17b10 72 20 2a 70 43 73 72 3b 0a 20 20 61 73 73 65 72  r *pCsr;.  asser
17b20 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
17b30 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
17b40 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
17b50 20 61 20 63 75 72 73 6f 72 20 68 65 6c 64 20 6f   a cursor held o
17b60 70 65 6e 20 62 79 20 74 68 69 73 20 62 2d 74 72  pen by this b-tr
17b70 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  ee connection. I
17b80 66 20 6f 6e 65 20 65 78 69 73 74 73 2c 0a 20 20  f one exists,.  
17b90 2a 2a 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e  ** then the tran
17ba0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
17bb0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
17bc0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
17bd0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65  ction.  ** inste
17be0 61 64 20 6f 66 20 61 63 74 75 61 6c 6c 79 20 63  ad of actually c
17bf0 6f 6e 63 6c 75 64 65 64 2e 20 41 20 73 75 62 73  oncluded. A subs
17c00 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43  equent call to C
17c10 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
17c20 0a 20 20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63  .  ** or Rollbac
17c30 6b 28 29 20 77 69 6c 6c 20 66 69 6e 69 73 68 20  k() will finish 
17c40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17c50 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  and unlock the d
17c60 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66  atabase.  */.  f
17c70 6f 72 28 70 43 73 72 3d 70 42 74 2d 3e 70 43 75  or(pCsr=pBt->pCu
17c80 72 73 6f 72 3b 20 70 43 73 72 20 26 26 20 70 43  rsor; pCsr && pC
17c90 73 72 2d 3e 70 42 74 72 65 65 21 3d 70 3b 20 70  sr->pBtree!=p; p
17ca0 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29  Csr=pCsr->pNext)
17cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
17cc0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
17cd0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
17ce0 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  .  btreeClearHas
17cf0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
17d00 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20  if( pCsr ){.    
17d10 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
17d20 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
17d30 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
17d40 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
17d50 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
17d60 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
17d70 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
17d80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
17d90 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
17da0 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
17db0 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
17dc0 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
17dd0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
17de0 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
17df0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
17e00 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
17e10 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
17e20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
17e30 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
17e40 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
17e50 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
17e60 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
17e70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
17e80 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
17e90 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
17ea0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
17eb0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
17ec0 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
17ed0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
17ee0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
17ef0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
17f00 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
17f10 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
17f20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
17f30 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
17f40 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
17f50 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
17f60 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
17f70 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
17f80 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
17f90 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
17fa0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
17fb0 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
17fc0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
17fd0 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
17fe0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
17ff0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
18000 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
18010 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
18020 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
18030 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
18040 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
18050 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
18060 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
18070 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
18080 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
18090 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
180a0 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
180b0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
180c0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
180d0 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
180e0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
180f0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18100 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
18110 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
18120 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
18130 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
18140 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
18150 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
18160 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
18170 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
18180 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
18190 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
181a0 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
181b0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
181c0 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
181d0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
181e0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
181f0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
18200 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
18210 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
18220 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
18230 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
18240 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
18250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
18260 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
18270 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
18280 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
18290 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
182a0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
182b0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
182c0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
182d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
182e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
182f0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
18300 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18310 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
18320 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18330 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
18340 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
18350 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
18360 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
18370 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
18380 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
18390 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
183a0 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
183b0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
183c0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
183d0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
183e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
183f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
18400 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
18410 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
18420 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
18430 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
18440 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
18450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18460 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
18470 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
18480 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
184a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
184b0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
184c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
184d0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
184e0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
184f0 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
18500 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
18510 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18520 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18540 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
18550 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
18560 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18570 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
18580 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
18590 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
185a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
185b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
185c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
185d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
185e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
185f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
18600 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29  ommitPhaseTwo(p)
18610 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
18620 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18630 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
18640 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
18650 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
18660 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
18670 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
18680 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
18690 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
186a0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
186b0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
186c0 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
186d0 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
186e0 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
186f0 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
18700 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
18710 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
18720 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
18730 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
18740 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
18750 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
18760 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
18770 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
18780 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
18790 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
187a0 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
187b0 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
187c0 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
187d0 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
187e0 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
187f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
18800 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
18810 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
18820 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
18830 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
18840 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
18850 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
18860 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
18870 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
18880 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
18890 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
188a0 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
188b0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
188c0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
188d0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
188e0 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
188f0 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
18900 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
18910 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
18920 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
18930 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
18940 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
18950 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
18960 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
18970 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
18980 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
18990 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
189a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
189b0 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
189c0 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
189d0 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
189e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
189f0 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
18a00 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
18a10 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
18a20 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
18a30 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
18a40 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
18a50 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
18a60 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
18a70 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
18a80 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
18a90 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
18aa0 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
18ab0 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
18ac0 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
18ad0 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
18ae0 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
18af0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
18b00 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
18b10 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
18b20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
18b30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
18b40 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
18b50 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
18b60 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
18b70 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
18b80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18b90 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
18ba0 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
18bb0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
18bc0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
18bd0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
18be0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
18bf0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
18c00 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
18c10 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
18c20 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
18c30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
18c40 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
18c50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18c60 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
18c70 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
18c80 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
18c90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18ca0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
18cb0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
18cc0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18cd0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
18ce0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
18cf0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
18d00 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
18d10 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
18d20 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
18d30 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
18d40 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
18d50 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
18d60 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
18d70 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
18d80 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
18d90 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
18da0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
18db0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
18dc0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
18dd0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
18de0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
18df0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
18e00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18e10 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
18e20 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
18e30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18e40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
18e50 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
18e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18e70 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61  er(p);.  rc = sa
18e80 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
18e90 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
18ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
18eb0 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
18ec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18ed0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
18ee0 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
18ef0 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
18f00 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
18f10 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20  curred whilst.  
18f20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73    ** trying to s
18f30 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ave cursor posit
18f40 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73  ions. If this is
18f50 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f   an automatic ro
18f60 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a  llback (as.    *
18f70 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
18f80 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61  a constraint, ma
18f90 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f  lloc() failure o
18fa0 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e  r IO error) then
18fb0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63   .    ** the cac
18fc0 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e  he may be intern
18fd0 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ally inconsisten
18fe0 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76  t (not contain v
18ff0 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20  alid trees) so. 
19000 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
19010 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
19020 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63  e error to the c
19030 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20  aller. Instead, 
19040 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c  abort .    ** al
19050 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  l queries that m
19060 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20  ay be using any 
19070 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
19080 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61  hat failed to sa
19090 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ve..    */.    s
190a0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
190b0 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29  llCursors(p, rc)
190c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
190d0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
190e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
190f0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19100 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
19110 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
19120 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
19130 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
19140 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
19150 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19160 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
19170 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
19180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
19190 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
191a0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
191b0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
191c0 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
191d0 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
191e0 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
191f0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
19200 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
19210 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
19220 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
19230 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
19240 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
19250 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
19260 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
19270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19280 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19290 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
192a0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
192b0 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
192c0 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
192d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
192e0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
192f0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
19300 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
19310 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19320 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19330 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
19340 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
19350 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
19360 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
19370 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
19380 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
19390 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
193a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
193b0 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
193c0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
193d0 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
193e0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
193f0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
19400 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
19410 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
19420 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
19430 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
19440 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
19450 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
19460 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
19470 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
19480 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
19490 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
194a0 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
194b0 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
194c0 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
194d0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
194e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
194f0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
19500 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
19510 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
19520 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
19530 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
19540 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
19550 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
19560 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19570 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
19580 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
19590 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
195a0 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
195b0 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
195c0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
195d0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
195e0 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
195f0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
19600 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
19610 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
19620 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
19630 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
19640 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
19650 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
19660 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
19670 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
19680 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
19690 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
196a0 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
196b0 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
196c0 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
196d0 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
196e0 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
196f0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
19700 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
19710 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
19720 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
19730 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
19740 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
19750 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
19760 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19770 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19780 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
19790 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
197a0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
197b0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65   assert( pBt->re
197c0 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
197d0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
197e0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
197f0 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
19800 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
19810 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
19820 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
19830 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61  RITE || pBt->rea
19840 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63  dOnly) ){.    rc
19850 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
19860 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AL;.  }else{.   
19870 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
19880 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19890 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
198a0 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
198b0 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
198c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
198d0 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
198e0 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64  th.    ** an ind
198f0 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
19900 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
19910 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
19920 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53  y using.    ** S
19930 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
19940 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
19950 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
19960 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
19970 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
19980 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
19990 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
199a0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
199b0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f  s active..    */
199c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
199d0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
199e0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
199f0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
19a00 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
19a10 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19a20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19a30 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
19a40 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
19a50 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
19a60 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
19a70 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
19a80 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
19a90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
19aa0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
19ab0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
19ac0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
19ad0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
19ae0 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
19af0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
19b00 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
19b10 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
19b20 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
19b30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
19b40 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
19b50 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
19b60 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
19b70 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
19b80 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
19b90 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
19ba0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
19bb0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
19bc0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
19bd0 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
19be0 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
19bf0 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
19c00 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
19c10 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
19c20 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
19c30 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
19c40 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
19c50 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
19c60 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
19c70 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
19c80 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
19c90 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
19ca0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19cb0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
19cc0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19cd0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
19ce0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
19d00 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
19d10 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
19d20 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
19d30 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
19d40 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
19d50 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
19d60 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
19d70 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
19d80 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19d90 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
19da0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
19db0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
19dc0 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
19dd0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19df0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
19e00 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
19e10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19e20 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
19e30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19e40 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
19e50 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
19e60 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
19e70 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
19e80 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
19e90 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
19ea0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
19eb0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
19ec0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
19ed0 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
19ee0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
19ef0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
19f00 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
19f10 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
19f20 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
19f30 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
19f40 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
19f50 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
19f60 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
19f70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
19f80 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
19f90 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
19fa0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
19fb0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
19fc0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
19fd0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
19fe0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
19ff0 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
1a000 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
1a010 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
1a020 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
1a030 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
1a040 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
1a050 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
1a060 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
1a070 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
1a080 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
1a090 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
1a0a0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
1a0b0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
1a0c0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
1a0d0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
1a0e0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1a0f0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
1a100 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
1a110 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
1a120 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
1a130 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
1a140 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
1a150 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
1a160 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
1a170 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
1a180 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
1a190 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
1a1a0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
1a1b0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
1a1c0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
1a1d0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
1a1e0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
1a1f0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1a200 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
1a210 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
1a220 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
1a230 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
1a240 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
1a250 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
1a260 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
1a270 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1a280 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
1a290 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
1a2a0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
1a2b0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
1a2c0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
1a2d0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
1a2e0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
1a2f0 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
1a300 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
1a310 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
1a320 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
1a330 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
1a340 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
1a350 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d  ize() bytes of m
1a360 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65  emory .** pointe
1a370 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61 76  d to by pCur hav
1a380 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  e been zeroed by
1a390 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1a3a0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1a3b0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1a3c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1a3f0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1a420 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1a430 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1a440 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1a470 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1a480 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1a490 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1a4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1a4b0 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1a4c0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1a4d0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1a4e0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1a4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1a500 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1a510 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1a520 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a530 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a540 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1a550 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1a560 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1a570 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1a580 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1a590 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1a5a0 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1a5b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1a5c0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1a5d0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1a5e0 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1a5f0 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1a600 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1a610 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1a620 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1a630 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1a640 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1a650 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1a660 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1a670 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1a680 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1a690 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1a6a0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1a6b0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1a6c0 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1a6d0 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1a6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1a6f0 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1a700 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1a710 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1a720 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1a730 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1a740 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1a750 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1a760 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1a770 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1a780 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1a790 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1a7a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1a7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1a7c0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1a7d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1a7e0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1a7f0 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72  wrFlag && pBt->r
1a800 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
1a810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1a820 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1a830 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70  ( iTable==1 && p
1a840 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1a850 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  t)==0 ){.    ret
1a860 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  urn SQLITE_EMPTY
1a870 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1a880 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1a890 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1a8a0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1a8b0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1a8c0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1a8d0 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1a8e0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1a8f0 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1a900 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1a910 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1a920 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1a930 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1a940 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1a950 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1a960 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1a970 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
1a980 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
1a990 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
1a9a0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
1a9b0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
1a9c0 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
1a9d0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1a9e0 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
1a9f0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
1aa00 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
1aa10 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1aa20 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64  ;.  pCur->cached
1aa30 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74  Rowid = 0;.  ret
1aa40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1aa50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1aa60 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1aa70 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1aaa0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1aab0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aad0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1aae0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1aaf0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1ab00 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1ab30 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1ab40 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1ab50 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab70 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1ab80 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
1ab90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1abc0 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
1abd0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1abe0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1abf0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1ac00 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
1ac10 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
1ac20 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
1ac30 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
1ac40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1ac50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ac60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1ac70 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
1ac80 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
1ac90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
1aca0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
1acb0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
1acc0 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
1acd0 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
1ace0 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
1acf0 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
1ad00 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
1ad10 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
1ad20 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
1ad30 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
1ad40 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
1ad50 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
1ad60 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
1ad70 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
1ad80 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1ad90 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
1ada0 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74  return sizeof(Bt
1adb0 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Cursor);.}../*.*
1adc0 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
1add0 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
1ade0 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
1adf0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
1ae00 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
1ae10 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
1ae20 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
1ae30 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
1ae40 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
1ae50 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
1ae60 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
1ae70 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
1ae80 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1ae90 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
1aea0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
1aeb0 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
1aec0 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
1aed0 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
1aee0 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
1aef0 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
1af00 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
1af10 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
1af20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
1af30 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
1af40 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1af50 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
1af60 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
1af70 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
1af80 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
1af90 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
1afa0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
1afb0 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
1afc0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1afd0 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
1afe0 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
1aff0 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
1b000 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
1b010 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
1b020 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1b030 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
1b040 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
1b050 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
1b060 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
1b070 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1b080 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1b090 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
1b0a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
1b0b0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1b0c0 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
1b0d0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
1b0e0 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
1b0f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1b100 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
1b110 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
1b120 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
1b130 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
1b140 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1b150 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1b160 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
1b170 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1b180 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
1b190 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
1b1a0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
1b1b0 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
1b1c0 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
1b1d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1b1e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1b1f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
1b200 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1b210 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1b220 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
1b230 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
1b240 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1b250 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1b260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b270 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1b280 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1b290 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1b2a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b2b0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1b2c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1b2d0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1b2e0 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1b2f0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1b300 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1b310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b320 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1b330 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b340 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1b350 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1b360 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1b370 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1b380 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1b390 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1b3a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1b3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1b3c0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1b3d0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1b3e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1b3f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1b400 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1b410 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1b420 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1b430 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1b440 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1b450 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1b460 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1b470 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1b480 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1b490 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
1b4a0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
1b4b0 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
1b4c0 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
1b4d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1b4e0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1b4f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b500 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b510 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1b520 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1b530 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1b540 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1b550 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1b560 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1b570 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1b580 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
1b590 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1b5a0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1b5b0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1b5c0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1b5d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1b5e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1b5f0 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1b600 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1b610 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1b620 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
1b630 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
1b640 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
1b650 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
1b660 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
1b670 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
1b680 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
1b690 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
1b6a0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
1b6b0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
1b6c0 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
1b6d0 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
1b6e0 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
1b6f0 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
1b700 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
1b710 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
1b720 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
1b730 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
1b740 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
1b750 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
1b760 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
1b770 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
1b780 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
1b790 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
1b7a0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
1b7b0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
1b7c0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
1b7d0 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
1b7e0 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
1b7f0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
1b800 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1b810 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
1b820 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
1b830 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1b840 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
1b850 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
1b860 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
1b870 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1b880 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1b890 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1b8a0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
1b8b0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1b8c0 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1b8d0 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1b8e0 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1b8f0 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1b900 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1b910 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1b920 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1b930 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1b940 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1b950 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1b960 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1b970 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1b980 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1b990 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1b9a0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1b9b0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1b9c0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1b9d0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1b9e0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1b9f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1ba00 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1ba10 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1ba20 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1ba30 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1ba40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ba50 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1ba60 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1ba70 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
1ba80 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
1ba90 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
1baa0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
1bab0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
1bac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
1bad0 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
1bae0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1baf0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
1bb30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1bb40 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1bb80 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1bb90 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
1bbd0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1bbe0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1bbf0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1bc00 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1bc10 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
1bc20 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1bcc0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd00 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1bd10 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1bd20 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
1bd30 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
1bd40 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
1bd50 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
1bd60 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
1bd70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
1bd80 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
1bd90 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1bda0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
1bdb0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
1bdc0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
1bdd0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
1bde0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
1bdf0 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
1be00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1be10 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
1be20 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
1be30 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1be40 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
1be50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1be60 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1be70 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1be80 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
1be90 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1bea0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1beb0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1bec0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1bed0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1bee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bef0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1bf00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1bf10 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
1bf20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1bf30 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
1bf40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1bf50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1bf60 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
1bf70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1bf80 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1bf90 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
1bfa0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1bfb0 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
1bfc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bfd0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1bfe0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1bff0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1c000 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1c010 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1c020 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1c030 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
1c040 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
1c050 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1c060 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
1c070 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
1c080 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
1c090 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
1c0a0 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
1c0b0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
1c0c0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1c0d0 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
1c0e0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1c0f0 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
1c100 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1c110 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1c120 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1c130 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1c140 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c150 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1c160 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1c170 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1c180 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1c1a0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1c1b0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1c1c0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1c1d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1c1e0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1c1f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1c200 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1c210 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
1c220 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
1c230 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
1c240 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
1c250 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
1c260 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
1c270 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1c280 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1c290 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
1c2a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c2b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
1c2c0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
1c2d0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
1c2e0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
1c2f0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
1c300 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
1c310 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
1c320 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1c330 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
1c340 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
1c350 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
1c360 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
1c370 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
1c380 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
1c390 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
1c3a0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
1c3b0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
1c3c0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
1c3d0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
1c3e0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1c3f0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
1c400 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1c410 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1c420 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
1c430 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1c440 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1c450 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
1c460 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
1c470 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
1c480 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
1c490 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1c4a0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
1c4b0 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
1c4c0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
1c4d0 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
1c4e0 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
1c4f0 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
1c500 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
1c510 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
1c520 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
1c530 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
1c540 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
1c550 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1c560 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
1c570 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
1c580 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
1c590 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
1c5a0 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
1c5b0 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
1c5c0 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
1c5d0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
1c5e0 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
1c5f0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
1c600 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
1c610 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
1c620 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1c630 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
1c640 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
1c650 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1c660 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
1c670 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
1c680 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
1c690 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1c6a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1c6b0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1c6c0 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c6e0 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
1c6f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1c700 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
1c710 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
1c720 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
1c730 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
1c740 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
1c750 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
1c760 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
1c770 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
1c780 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
1c790 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
1c7a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1c7b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
1c7c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1c7d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1c7e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1c7f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1c800 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
1c810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c820 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
1c830 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
1c840 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1c850 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1c860 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
1c870 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
1c880 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
1c890 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
1c8a0 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
1c8b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1c8c0 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
1c8d0 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
1c8e0 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
1c8f0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
1c900 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
1c910 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
1c920 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
1c930 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
1c940 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
1c950 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
1c960 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
1c970 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1c980 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
1c990 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
1c9a0 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
1c9b0 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
1c9c0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1c9d0 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
1c9e0 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
1c9f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1ca00 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
1ca10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1ca20 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61   iGuess<=pagerPa
1ca30 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
1ca40 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1ca50 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
1ca60 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
1ca70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1ca80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
1ca90 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1caa0 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
1cab0 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
1cac0 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
1cad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cae0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
1caf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1cb00 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
1cb10 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
1cb20 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
1cb30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cb40 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1cb50 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
1cb60 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   &pPage, 0);.   
1cb70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1cb80 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
1cb90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
1cba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cbb0 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
1cbc0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1cbd0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
1cbe0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
1cbf0 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
1cc00 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
1cc10 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
1cc20 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
1cc30 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
1cc40 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
1cc50 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
1cc60 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
1cc70 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
1cc80 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
1cc90 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
1cca0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
1ccb0 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
1ccc0 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
1ccd0 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
1cce0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1ccf0 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
1cd00 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
1cd10 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
1cd20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
1cd30 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
1cd40 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
1cd50 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
1cd60 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
1cd70 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
1cd80 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
1cd90 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
1cda0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
1cdb0 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
1cdc0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
1cdd0 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
1cde0 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
1cdf0 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
1ce00 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1ce10 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
1ce20 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
1ce30 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1ce40 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
1ce50 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
1ce60 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
1ce70 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
1ce80 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
1ce90 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1cea0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ceb0 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
1cec0 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
1ced0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cee0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
1cef0 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
1cf20 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
1cf30 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
1cf40 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
1cf50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1cf60 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
1cf70 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
1cf80 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
1cf90 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1cfa0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
1cfb0 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
1cfc0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
1cfd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1cfe0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1cff0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d010 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d020 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
1d030 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
1d040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1d050 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1d060 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
1d070 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
1d080 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
1d090 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
1d0a0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
1d0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d0c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d0d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1d0e0 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
1d0f0 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
1d100 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
1d110 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1d120 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
1d130 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
1d140 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
1d150 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
1d160 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
1d170 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
1d180 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
1d190 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
1d1a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
1d1b0 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
1d1c0 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
1d1d0 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
1d1e0 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
1d1f0 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
1d200 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
1d210 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
1d220 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
1d230 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
1d240 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
1d250 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
1d260 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
1d270 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
1d280 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
1d290 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
1d2a0 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
1d2b0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
1d2c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
1d2d0 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
1d2e0 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1d2f0 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
1d300 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
1d310 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
1d320 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
1d330 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
1d340 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
1d350 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
1d360 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
1d370 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
1d380 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
1d390 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
1d3a0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
1d3b0 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
1d3c0 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
1d3d0 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
1d3e0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
1d3f0 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
1d400 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
1d410 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
1d420 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1d430 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1d440 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
1d450 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
1d460 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
1d470 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
1d480 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
1d490 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
1d4a0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
1d4b0 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
1d4c0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
1d4d0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
1d4e0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
1d4f0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
1d500 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
1d510 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1d520 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
1d530 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1d540 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
1d550 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
1d560 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
1d570 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
1d580 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
1d590 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
1d5a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
1d5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1d5c0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
1d5d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d5e0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
1d5f0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
1d600 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1d610 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
1d620 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1d630 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
1d640 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
1d650 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
1d660 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
1d670 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1d680 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
1d690 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
1d6a0 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
1d6b0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
1d6c0 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
1d6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
1d6e0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
1d6f0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
1d700 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
1d710 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
1d720 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d730 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  _OK;.  u32 nKey;
1d740 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
1d750 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d760 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1d770 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
1d780 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
1d790 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
1d7a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d7b0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d7d0 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
1d7e0 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
1d7f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d800 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
1d810 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1d820 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1d830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1d840 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1d850 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1d860 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d870 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d880 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
1d890 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
1d8a0 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
1d8b0 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
1d8c0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1d8d0 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
1d8e0 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e  intKey ? 0 : (in
1d8f0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
1d900 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  y);..  if( NEVER
1d910 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b  (offset+amt > nK
1d920 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
1d930 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61  ata) .   || &aPa
1d940 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
1d950 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
1d960 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
1d970 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20  ableSize].  ){. 
1d980 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
1d990 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
1d9a0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
1d9b0 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
1d9c0 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
1d9d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d9e0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
1d9f0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
1da00 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
1da10 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
1da20 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
1da30 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
1da40 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
1da50 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
1da60 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
1da70 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
1da80 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1da90 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
1daa0 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
1dab0 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
1dac0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1dad0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
1dae0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1daf0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1db00 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
1db10 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
1db20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1db30 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
1db40 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
1db50 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
1db60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db70 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1db80 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
1db90 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
1dba0 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
1dbb0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
1dbc0 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
1dbd0 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
1dbe0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
1dbf0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
1dc00 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1dc10 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
1dc20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1dc30 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
1dc40 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
1dc50 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
1dc60 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
1dc70 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
1dc80 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
1dc90 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
1dca0 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
1dcb0 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
1dcc0 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
1dcd0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
1dce0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1dcf0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
1dd00 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
1dd10 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1dd20 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
1dd30 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
1dd40 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
1dd50 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
1dd60 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
1dd70 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
1dd80 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
1dd90 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
1dda0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
1ddb0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
1ddc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ddd0 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
1dde0 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
1ddf0 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
1de00 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
1de10 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
1de20 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
1de30 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
1de40 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
1de50 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1de60 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
1de70 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
1de80 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
1de90 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76  l);.      /* nOv
1dea0 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73  fl is always pos
1deb0 69 74 69 76 65 2e 20 20 49 66 20 69 74 20 77 65  itive.  If it we
1dec0 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61  re zero, fetchPa
1ded0 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65  yload would have
1dee0 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75  .      ** been u
1def0 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
1df00 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a  his routine. */.
1df10 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1df20 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72  (nOvfl) && !pCur
1df30 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1df40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1df50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1df60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1df70 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
1df80 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1df90 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1dfa0 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
1dfb0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1dfc0 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
1dfd0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1dfe0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
1dff0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
1e000 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
1e010 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1e020 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
1e030 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
1e040 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
1e050 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
1e060 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
1e070 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
1e080 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
1e090 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
1e0a0 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
1e0b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1e0c0 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
1e0d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1e0e0 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
1e0f0 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
1e100 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1e110 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
1e120 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
1e130 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
1e140 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1e150 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
1e160 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e170 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1e180 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
1e190 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
1e1a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1e1b0 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
1e1c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
1e1d0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
1e1e0 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
1e1f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
1e200 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
1e210 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
1e220 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
1e230 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
1e240 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
1e250 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
1e260 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
1e270 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1e280 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1e290 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
1e2a0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
1e2b0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
1e2c0 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
1e2d0 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
1e2e0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
1e2f0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
1e300 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
1e310 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
1e320 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
1e330 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
1e340 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
1e350 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e360 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1e370 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1e380 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1e390 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
1e3a0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
1e3b0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1e3c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
1e3d0 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
1e3e0 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
1e3f0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
1e400 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
1e410 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
1e420 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
1e430 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
1e440 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
1e450 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
1e460 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
1e470 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
1e480 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
1e490 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1e4a0 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
1e4b0 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
1e4c0 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
1e4d0 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
1e4e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e4f0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1e500 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
1e510 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
1e520 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e530 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
1e540 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
1e550 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1e560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
1e580 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
1e590 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
1e5a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e5b0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
1e5c0 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
1e5d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
1e5e0 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
1e5f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1e600 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
1e610 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1e620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e630 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
1e640 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
1e650 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
1e660 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
1e670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1e680 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
1e690 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
1e6a0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
1e6b0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1e6c0 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
1e6d0 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
1e6e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e6f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e700 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
1e710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e720 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
1e750 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
1e760 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1e770 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1e780 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1e790 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1e7a0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1e7b0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1e7c0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1e7d0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1e7e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1e7f0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1e800 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1e810 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1e820 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1e830 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1e840 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1e850 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1e860 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1e870 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1e880 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
1e890 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1e8a0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1e8b0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1e8c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1e8d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e8e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e8f0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1e900 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1e910 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1e930 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e940 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e950 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e960 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1e970 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e980 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1e990 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50 61    if( pCur->apPa
1e9a0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
1e9b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e9c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e9d0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
1e9e0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1e9f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
1ea00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1ea10 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
1ea20 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
1ea30 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
1ea40 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
1ea50 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
1ea60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1ea70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ea80 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1ea90 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
1eaa0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1eab0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1eac0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1ead0 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1eae0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1eaf0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1eb00 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1eb10 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1eb20 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1eb30 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1eb40 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1eb50 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1eb60 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1eb70 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1eb80 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1eb90 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1eba0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1ebb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ebc0 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
1ebd0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1ebe0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1ebf0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1ec00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ec10 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1ec20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
1ec30 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1ec40 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
1ec50 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
1ec60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1ec70 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ec80 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ec90 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1eca0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1ecb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1ecc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1ecd0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ece0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ecf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ed00 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1ed10 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1ed20 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1ed30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ed40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ed50 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1ed60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1ed70 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1ed80 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1ed90 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1eda0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
1edb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1edc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1edd0 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
1ede0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
1edf0 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
1ee00 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
1ee10 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1ee20 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
1ee30 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
1ee40 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
1ee50 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
1ee60 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
1ee70 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1ee80 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
1ee90 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
1eea0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1eeb0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
1eec0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
1eed0 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
1eee0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
1eef0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
1ef00 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
1ef10 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
1ef20 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
1ef30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
1ef40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
1ef50 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
1ef60 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
1ef70 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
1ef80 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
1ef90 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
1efa0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
1efb0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
1efc0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
1efd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1efe0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
1eff0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
1f000 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
1f010 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
1f020 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
1f030 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
1f040 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
1f050 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
1f060 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
1f070 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
1f080 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
1f090 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
1f0a0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
1f0b0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
1f0c0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
1f0d0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
1f0e0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
1f0f0 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
1f100 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
1f110 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1f120 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
1f130 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
1f140 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
1f150 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
1f160 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
1f170 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
1f180 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
1f190 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
1f1a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1f1b0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1f1c0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1f1d0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
1f1e0 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
1f1f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1f200 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1f210 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
1f220 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
1f230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
1f240 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
1f250 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
1f260 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
1f270 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
1f280 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
1f290 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
1f2a0 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
1f2b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
1f2c0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
1f2d0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1f2e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f2f0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
1f300 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f310 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1f320 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f330 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f340 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1f350 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f360 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
1f370 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1f380 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1f390 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65  nCell );.  getCe
1f3a0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1f3b0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1f3c0 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
1f3d0 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
1f3e0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1f3f0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1f400 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
1f410 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1f420 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
1f430 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1f440 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
1f450 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
1f460 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
1f470 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1f480 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
1f490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
1f4a0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
1f4b0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
1f4c0 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
1f4d0 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
1f4e0 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
1f4f0 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
1f500 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
1f510 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
1f520 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1f530 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
1f540 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
1f550 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
1f560 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
1f570 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
1f580 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
1f590 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
1f5a0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
1f5b0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1f5c0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
1f5d0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
1f5e0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
1f5f0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
1f600 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
1f610 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
1f620 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
1f630 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
1f640 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
1f650 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
1f660 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
1f670 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
1f680 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
1f690 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
1f6a0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
1f6b0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
1f6c0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
1f6d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1f6e0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
1f6f0 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
1f700 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
1f710 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
1f720 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
1f730 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
1f740 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
1f750 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
1f760 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1f770 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
1f780 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1f790 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1f7a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1f7b0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1f7c0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1f7d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f7e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f7f0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
1f800 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f810 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1f820 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
1f830 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1f840 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
1f850 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1f860 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
1f870 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
1f880 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
1f890 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
1f8a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1f8b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1f8c0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1f8d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1f8e0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f8f0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
1f900 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f910 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1f920 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
1f930 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
1f940 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
1f950 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
1f960 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   0;.}.../*.** Mo
1f970 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1f980 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
1f990 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
1f9a0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
1f9b0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
1f9c0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
1f9d0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
1f9e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
1f9f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
1fa00 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
1fa10 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
1fa20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
1fa30 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
1fa40 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
1fa50 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
1fa60 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
1fa70 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
1fa80 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
1fa90 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
1faa0 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
1fab0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
1fac0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
1fad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1fae0 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
1faf0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
1fb00 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
1fb10 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d  .  int i = pCur-
1fb20 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  >iPage;.  MemPag
1fb30 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42  e *pNewPage;.  B
1fb40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fb50 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
1fb60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1fb70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1fb80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1fb90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1fba0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1fbb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
1fbc0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
1fbd0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
1fbe0 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
1fbf0 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
1fc00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fc10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1fc20 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
1fc30 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
1fc40 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
1fc50 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1fc60 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72  eturn rc;.  pCur
1fc70 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20  ->apPage[i+1] = 
1fc80 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
1fc90 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30  ->aiIdx[i+1] = 0
1fca0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
1fcb0 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  +;..  pCur->info
1fcc0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1fcd0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1fce0 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  0;.  if( pNewPag
1fcf0 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e  e->nCell<1 || pN
1fd00 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d  ewPage->intKey!=
1fd10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
1fd20 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
1fd30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1fd40 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1fd50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fd60 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  K;.}..#ifndef ND
1fd70 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
1fd80 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
1fd90 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
1fda0 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
1fdb0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
1fdc0 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
1fdd0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
1fde0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
1fdf0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
1fe00 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
1fe10 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
1fe20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
1fe30 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1fe40 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
1fe50 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
1fe60 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
1fe70 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
1fe80 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
1fe90 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1fea0 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
1feb0 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
1fec0 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
1fed0 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
1fee0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
1fef0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1ff00 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
1ff10 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
1ff20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1ff30 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1ff40 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1ff50 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
1ff60 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
1ff70 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1ff80 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1ff90 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
1ffa0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
1ffb0 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
1ffc0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1ffd0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
1ffe0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1fff0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
20000 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
20010 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
20020 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
20030 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
20040 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
20050 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
20060 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
20070 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
20080 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
20090 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
200a0 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
200b0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
200c0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
200d0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
200e0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
200f0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
20100 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
20110 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
20120 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20130 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20140 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20150 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20170 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
20180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
20190 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
201a0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
201b0 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
201c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
201d0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
201e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
201f0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
20200 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20210 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
20220 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  .  );.  releaseP
20230 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
20240 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
20250 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
20260 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
20270 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
20280 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
20290 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
202a0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
202b0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
202c0 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
202d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
202e0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
202f0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
20300 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
20310 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
20320 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
20330 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
20340 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
20350 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
20360 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
20370 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
20380 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
20390 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
203a0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
203b0 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
203c0 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
203d0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
203e0 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
203f0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
20400 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
20410 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
20420 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
20430 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
20440 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
20450 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
20460 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
20470 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
20480 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
20490 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
204a0 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
204b0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
204c0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
204d0 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
204e0 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
204f0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
20500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
20510 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
20520 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
20530 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
20540 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
20550 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
20560 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
20570 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
20580 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
20590 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
205a0 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
205b0 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
205c0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
205d0 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
205e0 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
205f0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
20600 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
20610 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
20620 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
20630 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
20640 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
20650 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
20660 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
20670 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
20680 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
20690 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
206a0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
206b0 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
206c0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
206d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
206e0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
206f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20700 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
20710 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
20720 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
20730 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
20740 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20750 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20760 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
20770 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
20780 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
20790 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
207a0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
207b0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
207c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
207d0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
207e0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
207f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
20800 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
20810 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
20820 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
20830 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
20840 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20850 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
20860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
20870 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
20880 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
20890 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
208a0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
208b0 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
208c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
208d0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
208e0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75   for(i=1; i<=pCu
208f0 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
20900 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
20910 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
20920 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ]);.    }.    pC
20930 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
20940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
20950 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
20960 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
20970 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
20980 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  ge[0]);.    if( 
20990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
209a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
209b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
209c0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
209d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
209e0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
209f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75  ;..    /* If pCu
20a00 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
20a10 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
20a20 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
20a30 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
20a40 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64  .    ** expected
20a50 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
20a60 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
20a70 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
20a80 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a  eyInfo is.    **
20a90 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
20aa0 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
20ab0 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
20ac0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
20ad0 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e,.    ** return
20ae0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
20af0 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  PT error.  */.  
20b00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20b10 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
20b20 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70  y==1 || pCur->ap
20b30 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
20b40 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
20b50 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
20b60 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  )!=pCur->apPage[
20b70 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
20b80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20b90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20ba0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20bb0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
20bc0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20  root page is of 
20bd0 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
20be0 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74  . This must be t
20bf0 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20  he.  ** case as 
20c00 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  the call to this
20c10 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c   function that l
20c20 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70  oaded the root-p
20c30 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a  age (either.  **
20c40 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20   this call or a 
20c50 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74  previous invocat
20c60 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20  ion) would have 
20c70 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
20c80 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  ion .  ** if the
20c90 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65   assumption were
20ca0 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69   not true, and i
20cb0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
20cc0 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20  e for the flags 
20cd0 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61  .  ** byte to ha
20ce0 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
20cf0 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73   while this curs
20d00 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  or is holding a 
20d10 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74  reference.  ** t
20d20 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a  o the page.  */.
20d30 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
20d40 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
20d50 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
20d60 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
20d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
20d80 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28  oot->isInit && (
20d90 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
20da0 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)==pRoot->intKe
20db0 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69  y );..  pCur->ai
20dc0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
20dd0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
20de0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
20df0 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
20e00 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
20e10 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
20e20 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
20e30 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
20e40 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
20e50 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
20e60 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
20e70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20e80 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
20e90 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
20ea0 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
20eb0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
20ec0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
20ed0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
20ee0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
20ef0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
20f00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
20f10 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
20f20 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
20f30 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
20f40 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
20f50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20f60 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
20f70 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
20f80 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
20f90 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
20fa0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
20fb0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
20fc0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
20fd0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
20fe0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
20ff0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
21000 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
21010 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
21020 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
21030 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
21040 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
21050 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
21060 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
21070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21080 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
21090 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
210a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
210b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
210c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
210d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
210e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
210f0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
21100 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21110 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
21120 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
21130 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21140 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
21150 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
21160 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
21170 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
21180 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21190 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
211a0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
211b0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
211c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
211d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
211e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
211f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
21200 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
21210 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
21220 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
21230 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
21240 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
21250 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
21260 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
21270 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
21280 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
21290 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
212a0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
212b0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
212c0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
212d0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
212e0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
212f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
21300 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
21310 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
21320 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
21330 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
21340 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
21350 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
21360 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
21370 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
21380 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
21390 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
213a0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
213b0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
213c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
213d0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
213e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
213f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21400 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21410 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21420 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21430 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21440 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
21450 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21460 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
21470 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
21480 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
21490 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
214a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
214b0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
214c0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
214d0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
214e0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
214f0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
21500 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
21520 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21530 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
21540 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
21550 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
21560 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
21570 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
21580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21590 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
215a0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
215b0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
215c0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
215d0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
215e0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
215f0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
21600 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
21610 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
21620 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
21630 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
21640 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
21650 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
21660 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
21670 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
21680 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
21690 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
216a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
216b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
216c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
216d0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
216e0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
216f0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
21700 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21710 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
21720 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21730 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
21740 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
21750 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21760 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
21770 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
21780 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
21790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
217a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
217b0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
217c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
217d0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
217e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
217f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
21800 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
21810 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
21820 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
21830 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
21840 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
21850 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
21860 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
21870 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
21880 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
21890 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
218a0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
218b0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
218c0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
218d0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
218e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
218f0 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
21900 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
21910 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
21920 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21930 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21940 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
21950 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21960 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
21970 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
21980 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
21990 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
219a0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
219b0 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
219c0 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
219d0 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
219e0 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72  ->eState && pCur
219f0 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64  ->atLast ){.#ifd
21a00 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21a10 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
21a20 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
21a30 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
21a40 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
21a50 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
21a60 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
21a70 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
21a80 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
21a90 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
21aa0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
21ab0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
21ac0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
21ad0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
21ae0 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
21af0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21b00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21b10 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
21b20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21b30 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
21b40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
21b50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21b60 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
21b70 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
21b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21b90 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
21ba0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
21bb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21bc0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
21bd0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
21be0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
21bf0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21c00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21c10 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
21c20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
21c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21c40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21c50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21c60 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
21c70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
21c80 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
21c90 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
21ca0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63  Cur->atLast = rc
21cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30  ==SQLITE_OK ?1:0
21cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
21ce0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
21cf0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
21d00 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
21d10 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
21d20 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
21d30 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
21d40 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
21d50 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
21d60 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
21d70 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
21d80 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
21d90 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
21da0 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
21db0 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
21dc0 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
21dd0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
21de0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
21df0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
21e00 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
21e10 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
21e20 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
21e30 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
21e40 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
21e50 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
21e60 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
21e70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
21e80 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
21e90 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
21ea0 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
21eb0 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
21ec0 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
21ed0 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
21ee0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
21ef0 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
21f00 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
21f10 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
21f20 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
21f30 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
21f40 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
21f50 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
21f60 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
21f70 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
21f80 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
21f90 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
21fa0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
21fb0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
21fc0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
21fd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21fe0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
21ff0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
22000 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
22010 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
22030 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
22040 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
22050 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
22060 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
22070 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
22080 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
22090 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
220a0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
220b0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
220c0 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
220d0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
220e0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
220f0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
22100 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
22110 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
22140 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
22150 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
22160 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
22170 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
22180 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
22190 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
221a0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
221b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
221c0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
221d0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
221e0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22200 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
22210 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
22220 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
22230 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
22240 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
22250 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
22260 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
22270 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22280 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
22290 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
222a0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
222b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
222c0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
222d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
222e0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
222f0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
22300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
22310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
22320 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
22330 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
22340 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
22350 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
22360 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
22370 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
22380 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
22390 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
223a0 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
223b0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
223c0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
223d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
223e0 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
223f0 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
22400 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
22410 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
22420 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
22430 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
22440 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
22450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22460 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
22470 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
22480 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
22490 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
224a0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
224b0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
224c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
224d0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
224e0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
224f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
22500 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
22510 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22520 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22530 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
22540 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22550 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
22560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22570 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22580 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
22590 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
225a0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
225b0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
225c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
225d0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
225e0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
225f0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22600 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22610 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
22620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22630 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
22640 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
22650 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
22660 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
22670 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
22680 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
22690 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
226a0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
226b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
226c0 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a  ge];.    int c;.
226d0 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
226e0 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
226f0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
22700 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
22710 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
22720 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
22730 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
22740 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
22750 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
22760 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
22770 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
22780 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
22790 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
227a0 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
227b0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
227c0 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
227d0 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
227e0 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
227f0 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
22800 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
22810 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
22820 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
22830 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
22840 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
22850 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
22860 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
22870 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
22880 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
22890 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
228a0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
228b0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
228c0 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
228d0 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
228e0 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
228f0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
22900 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
22910 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22920 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
22930 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73  16)upr;.    }els
22940 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
22950 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22960 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c  ] = (u16)((upr+l
22970 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  wr)/2);.    }.  
22980 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
22990 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
229a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
229b0 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f 66  ge]; /* Index of
229c0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
229d0 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20   pPage */.      
229e0 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
22a10 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
22a20 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
22a30 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
22a40 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ze = 0;.      pC
22a50 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
22a60 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
22a70 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
22a80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
22a90 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
22aa0 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
22ab0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
22ac0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
22ad0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
22ae0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
22af0 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
22b00 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
22b10 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
22b20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
22b30 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
22b40 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
22b50 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69   if( nCellKey==i
22b60 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
22b70 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
22b80 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
22b90 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
22ba0 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
22bb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22bc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22bd0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
22be0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
22bf0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
22c00 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76  .        pCur->v
22c10 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
22c20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
22c30 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
22c40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
22c60 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
22c70 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32 37  page-size is 327
22c80 36 38 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  68 bytes. This m
22c90 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
22ca0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
22cb0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
22cc0 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
22cd0 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
22ce0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
22cf0 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31 39  e is at most 819
22d00 38 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 6d  8 bytes, which m
22d10 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
22d20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
22d30 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
22d40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
22d50 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
22d60 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
22d70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
22d80 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
22d90 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
22da0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
22db0 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
22dc0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
22dd0 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
22de0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
22df0 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
22e00 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
22e10 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
22e20 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
22e30 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  /.        int nC
22e40 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
22e50 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43          if( !(nC
22e60 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e  ell & 0x80) && n
22e70 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
22e80 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
22e90 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
22ea0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
22eb0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
22ec0 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
22ed0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
22ee0 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
22ef0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
22f00 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
22f10 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
22f20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
22f30 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
22f40 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
22f50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22f60 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
22f70 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
22f80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
22f90 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
22fa0 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
22fb0 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
22fc0 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
22fd0 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
22fe0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
22ff0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23000 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
23010 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
23020 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
23030 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
23040 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
23050 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
23060 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
23070 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
23080 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
23090 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
230a0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
230b0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
230c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
230d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
230e0 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
230f0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
23100 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
23110 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
23120 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
23130 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
23140 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
23150 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
23160 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
23170 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
23180 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
23190 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
231a0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
231b0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
231c0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
231d0 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
231e0 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  alled. */.      
231f0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
23200 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
23210 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
23220 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
23230 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
23240 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  ;.          btre
23250 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
23260 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
23270 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
23280 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
23290 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
232a0 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
232b0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
232c0 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20  e3Malloc( nCell 
232d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
232e0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
232f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23300 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23310 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
23320 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
23330 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23340 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
23350 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
23360 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
23370 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
23380 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23390 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
233a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
233b0 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
233c0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
233d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
233e0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
233f0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
23400 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
23410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23420 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
23430 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
23440 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
23450 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
23460 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
23470 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
23480 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a   upr = lwr - 1;.
23490 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
234a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
234b0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
234c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
234d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
234e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
234f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
23500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23510 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
23520 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
23530 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x+1;.      }else
23540 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20  {.        upr = 
23550 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
23560 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
23570 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
23580 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
23590 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
235a0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
235b0 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  )((lwr+upr)/2);.
235c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
235d0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
235e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
235f0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
23600 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
23610 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
23620 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
23630 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
23640 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
23650 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
23660 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
23670 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
23680 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
23690 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
236a0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
236b0 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
236c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
236d0 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
236e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
236f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23700 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
23710 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
23720 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  l );.      *pRes
23730 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
23740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23750 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
23760 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
23770 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23780 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
23790 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lwr;.    pCur->i
237a0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
237b0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
237c0 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ey = 0;.    rc =
237d0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
237e0 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
237f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
23800 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d  veto_finish;.  }
23810 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
23820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23830 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
23840 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
23850 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
23860 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
23870 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
23880 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
23890 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
238a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
238b0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
238c0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
238d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
238e0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
238f0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
23900 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
23910 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
23920 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
23930 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
23940 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
23950 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
23960 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23970 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
23980 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
23990 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
239a0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
239b0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
239c0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
239d0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
239e0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
239f0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
23a00 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
23a10 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
23a20 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
23a30 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
23a40 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
23a50 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
23a60 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
23a70 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
23a80 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
23a90 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
23aa0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
23ab0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
23ac0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
23ad0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
23ae0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
23af0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
23b00 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
23b10 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
23b20 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
23b30 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
23b40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23b50 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
23b60 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
23b70 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
23b80 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
23b90 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
23ba0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23bb0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23bc0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
23bd0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
23be0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
23bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
23c00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
23c10 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
23c20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  );.  if( CURSOR_
23c30 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
23c40 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
23c50 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
23c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23c70 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
23c80 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
23c90 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
23ca0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
23cb0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
23cc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
23cd0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
23ce0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
23cf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23d00 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
23d10 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
23d20 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
23d30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
23d40 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
23d50 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
23d60 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
23d70 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23d80 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
23d90 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
23da0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
23db0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
23dc0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
23dd0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
23de0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
23df0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
23e00 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
23e10 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
23e20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
23e30 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
23e40 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
23e50 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
23e60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
23e80 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
23e90 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
23ea0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
23eb0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
23ec0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
23ed0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
23ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
23f00 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
23f10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
23f20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23f30 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
23f40 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
23f50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
23f60 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
23f70 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
23f80 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
23f90 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
23fa0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
23fb0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
23fc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23fd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23fe0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
23ff0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
24000 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
24010 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
24020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24030 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
24040 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
24050 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
24060 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
24070 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
24080 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
24090 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
240a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
240b0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
240c0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
240d0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
240e0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
240f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
24100 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
24110 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
24120 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
24130 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
24140 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
24150 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24160 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
24170 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
24180 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
24190 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
241a0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
241b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
241c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
241d0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
241e0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
241f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24200 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
24210 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
24220 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
24230 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
24240 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
24250 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
24260 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
24270 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
24280 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
24290 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
242a0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
242b0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
242c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
242d0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
242e0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
242f0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24300 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24310 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
24320 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
24330 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
24340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
24350 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
24360 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
24370 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24380 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
24390 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
243a0 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
243b0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
243c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
243d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
243e0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
243f0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
24400 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24410 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
24420 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
24430 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
24440 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
24450 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
24460 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
24470 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
24480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
244a0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
244b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
244c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
244d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
244e0 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
244f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24500 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
24510 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24520 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24530 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
24540 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
24550 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
24560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
24570 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
24580 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
24590 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
245a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
245b0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
245c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
245d0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
245e0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
245f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24600 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
24610 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
24620 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
24630 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
24640 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
24650 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
24660 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
24670 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
24680 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
24690 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
246a0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
246b0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
246c0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
246d0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
246e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
246f0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
24700 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
24710 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
24720 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
24730 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
24740 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
24750 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
24760 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
24770 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
24780 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
24790 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
247a0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
247b0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
247c0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
247d0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
247e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
247f0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
24800 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
24810 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
24820 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
24830 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
24840 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
24850 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
24860 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
24870 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
24880 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
24890 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
248a0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
248b0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
248c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
248d0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
248e0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
248f0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
24900 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
24910 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
24920 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
24930 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
24940 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
24950 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
24960 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
24970 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
24980 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
24990 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
249a0 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
249b0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
249c0 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
249d0 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
249e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
249f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
24a00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
24a10 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
24a20 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
24a30 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
24a40 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
24a50 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
24a60 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
24a70 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
24a80 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
24a90 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
24aa0 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
24ab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
24ac0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
24ad0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
24ae0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
24af0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
24b00 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
24b10 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
24b20 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
24b30 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
24b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
24b50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24b60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
24b70 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
24b80 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
24b90 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
24ba0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
24bb0 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
24bc0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
24bd0 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
24be0 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
24bf0 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
24c00 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
24c10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
24c20 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
24c30 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
24c40 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
24c50 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
24c60 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
24c70 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
24c80 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
24c90 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
24ca0 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
24cb0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
24cc0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
24cd0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
24ce0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
24cf0 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
24d00 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
24d10 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
24d20 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
24d30 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
24d40 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
24d50 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
24d60 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
24d70 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
24d80 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
24d90 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
24da0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
24db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24dc0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
24dd0 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
24de0 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
24df0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
24e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
24e10 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
24e20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
24e30 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
24e40 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
24e50 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
24e60 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
24e70 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
24e80 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
24e90 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
24ea0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
24eb0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
24ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
24ed0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
24ee0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
24ef0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
24f00 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
24f10 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
24f20 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
24f30 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
24f40 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
24f50 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
24f60 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
24f70 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
24f80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24f90 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
24fa0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
24fb0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
24fc0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
24fd0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
24fe0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
24ff0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
25000 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
25010 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
25020 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
25030 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
25040 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
25050 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
25060 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
25070 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
25080 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
25090 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
250a0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
250b0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
250c0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
250d0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
250e0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
250f0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
25100 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
25110 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
25120 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
25130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
25140 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
25150 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
25160 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
25170 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
25180 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
25190 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
251a0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
251b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
251c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
251d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
251e0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
251f0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
25200 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
25210 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
25220 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
25230 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
25240 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25250 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
25260 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
25270 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
25280 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
25290 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
252a0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
252b0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
252c0 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
252d0 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
252e0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
252f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
25300 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
25310 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
25320 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
25330 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
25340 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
25350 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
25360 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
25370 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
25380 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25390 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
253a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
253b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
253c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
253d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
253e0 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
253f0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
25400 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
25410 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
25420 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
25430 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
25440 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
25450 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
25460 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
25470 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
25480 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
25490 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
254a0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
254b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
254c0 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
254d0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
254e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
254f0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
25500 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
25510 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
25520 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25530 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25540 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
25550 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25560 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
25570 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25580 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
25590 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
255a0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
255b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
255c0 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
255d0 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
255e0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
255f0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
25600 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
25610 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
25620 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
25630 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
25640 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
25650 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
25660 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
25670 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
25680 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
25690 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
256a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
256b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
256c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
256d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
256e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
256f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
25700 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
25710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25720 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
25730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
25740 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
25750 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
25760 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
25770 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
25780 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
25790 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
257a0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
257b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
257c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
257d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
257e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
257f0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
25800 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
25810 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
25820 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
25830 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
25840 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
25850 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
25860 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
25870 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
25880 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
25890 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
258a0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
258b0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
258c0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
258d0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
258e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
258f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25900 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
25910 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
25920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25930 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
25940 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
25950 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
25960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25970 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
25980 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
25990 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
259a0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
259b0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
259c0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
259d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
259e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
259f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
25a00 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
25a10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
25a20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
25a30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25a40 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
25a50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
25a60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25a80 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
25a90 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
25aa0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
25ab0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
25ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25ad0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
25ae0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
25af0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
25b00 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
25b10 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
25b20 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
25b30 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
25b40 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
25b50 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
25b60 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
25b70 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
25b80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
25b90 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
25ba0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
25bb0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
25bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
25bd0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25be0 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
25bf0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
25c00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
25c10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
25c20 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
25c30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25c40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25c50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25c60 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
25c70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
25c80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
25c90 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25ca0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
25cb0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
25cc0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
25cd0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
25ce0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
25cf0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
25d00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
25d10 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
25d20 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
25d30 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
25d40 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
25d50 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
25d60 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
25d70 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
25d80 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
25d90 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
25da0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
25db0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
25dc0 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
25dd0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
25de0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
25df0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
25e00 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
25e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
25e20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
25e30 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
25e40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
25e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
25e60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25e70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
25e80 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
25e90 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
25ea0 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
25eb0 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
25ec0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
25ed0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  0;.          dis
25ee0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  t = get4byte(&aD
25ef0 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
25f00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25f10 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20  dist<0 ) dist = 
25f20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  -dist;.         
25f30 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
25f40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
25f50 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79   int d2 = get4by
25f60 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
25f70 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
25f80 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30          if( d2<0
25f90 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20   ) d2 = -d2;.   
25fa0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
25fb0 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
25fc0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
25fd0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
25fe0 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
25ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
26010 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
26020 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
26030 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
26040 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26050 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
26060 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
26070 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
26080 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
26090 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
260a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
260b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
260c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
260d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
260e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
260f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
26100 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
26110 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
26120 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
26130 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
26140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
26150 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
26160 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
26170 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
26180 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
26190 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
261a0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
261b0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
261c0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
261d0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
26200 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
26210 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
26220 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
26230 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
26240 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
26250 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
26260 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
26270 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
26280 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
26290 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
262a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  1);.          as
262b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
262c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
262d0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29  runk->pDbPage) )
262e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
262f0 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
26300 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
26310 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
26320 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26330 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
26340 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
26350 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
26360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26390 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
263a0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
263b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
263c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
263e0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
263f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
26400 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26410 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
26420 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
26430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
26440 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
26450 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
26460 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
26470 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
26480 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
26490 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
264a0 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
264b0 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
264c0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
264d0 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
264e0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
264f0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
26500 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
26510 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e  (pBt);.    *pPgn
26520 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a  o = nPage + 1;..
26530 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
26540 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26550 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
26560 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
26570 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
26580 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26590 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
265a0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
265b0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
265c0 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
265d0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
265e0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
265f0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
26600 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
26610 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
26620 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
26630 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
26640 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
26650 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
26660 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
26670 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
26680 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
26690 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
266a0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
266b0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
266c0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
266d0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
266e0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
266f0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
26700 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e   page)\n", *pPgn
26710 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  o));.      asser
26720 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
26730 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
26740 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
26750 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
26760 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20  , *pPgno, &pPg, 
26770 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
26780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26790 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
267a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
267b0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
267c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
267d0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
267e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
267f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28  turn rc;.      (
26800 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
26810 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
26820 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26830 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b  Bt) ){ (*pPgno)+
26840 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
26850 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
26860 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
26870 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
26880 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
26890 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
268a0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
268b0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
268c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
268d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
268e0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
268f0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
26900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26910 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
26920 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
26930 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
26940 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
26950 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
26960 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
26970 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
26980 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
26990 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
269a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
269b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
269c0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
269d0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
269e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
269f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
26a00 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
26a10 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
26a20 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
26a30 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
26a40 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
26a50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26a60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26a70 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
26a80 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
26a90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
26aa0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
26ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26ac0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26ad0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
26ae0 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
26af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26b00 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
26b10 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
26b20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
26b30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
26b40 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
26b50 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
26b60 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
26b70 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
26b80 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
26b90 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
26ba0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
26bb0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
26bc0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
26bd0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
26be0 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
26bf0 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
26c00 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
26c10 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
26c20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
26c30 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
26c40 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
26c50 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
26c60 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
26c70 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
26c80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
26c90 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
26ca0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
26cb0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
26cc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
26cd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
26ce0 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
26cf0 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
26d00 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
26d10 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
26d20 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d40 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
26d50 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
26d60 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d80 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
26d90 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
26da0 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
26db0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
26dc0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
26dd0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
26de0 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
26df0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
26e20 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
26e30 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
26e40 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e60 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
26e70 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
26ea0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
26eb0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
26ec0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
26ed0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26ee0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
26ef0 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
26f00 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
26f10 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
26f20 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
26f30 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
26f40 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
26f50 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
26f60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
26f70 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
26f80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26f90 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
26fa0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
26fb0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
26fc0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
26fd0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
26fe0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
26ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27000 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
27010 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
27020 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
27030 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
27040 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27050 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
27060 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27070 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
27080 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
27090 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
270a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
270b0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
270c0 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
270d0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
270e0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
270f0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
27100 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
27110 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
27120 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21  s..  */.  if( (!
27130 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20 62  pPage && (rc = b
27140 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
27150 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
27160 30 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20  0))).   ||      
27170 20 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69        (rc = sqli
27180 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
27190 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20  age->pDbPage)). 
271a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
271b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
271c0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
271d0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
271e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
271f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
27200 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
27210 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
27220 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
27230 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
27240 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
27250 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
27260 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
27270 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
27280 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
27290 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
272a0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
272b0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
272c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
272d0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
272e0 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
272f0 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
27300 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
27310 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
27320 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
27330 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
27340 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
27350 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
27360 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
27370 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
27380 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
27390 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
273a0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
273b0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
273c0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
273d0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
273e0 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
273f0 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
27400 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
27410 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
27420 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
27430 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
27440 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
27450 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
27460 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
27470 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
27480 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
27490 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
274a0 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
274b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
274c0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
274d0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
274e0 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
274f0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
27500 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
27510 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
27520 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
27530 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
27540 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
27550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27560 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
27570 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
27580 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
27590 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
275a0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
275b0 6e 4c 65 61 66 20 3e 20 70 42 74 2d 3e 75 73 61  nLeaf > pBt->usa
275c0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
275d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
275e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
275f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
27600 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
27610 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42      if( nLeaf<pB
27620 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
27630 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
27640 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
27650 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
27660 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
27670 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
27680 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
27690 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
276a0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
276b0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
276c0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
276d0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
276e0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
276f0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
27700 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
27710 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
27720 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
27730 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
27740 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
27750 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
27760 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
27770 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
27780 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
27790 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
277a0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
277b0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
277c0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
277d0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
277e0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
277f0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
27800 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
27810 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
27820 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
27830 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
27840 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
27850 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
27860 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
27870 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
27880 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
27890 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
278a0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
278b0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
278c0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
278d0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
278e0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
278f0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
27900 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
27910 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
27920 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
27930 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
27940 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
27950 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
27960 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
27970 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
27980 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
27990 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
279a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
279b0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
279c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
279d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
279e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
279f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
27a00 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
27a10 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
27a20 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
27a30 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23  af*4], iPage);.#
27a40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45  ifndef SQLITE_SE
27a50 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
27a60 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
27a70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27a80 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
27a90 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
27aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
27ab0 69 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  if.        rc = 
27ac0 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
27ad0 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
27ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
27af0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
27b00 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
27b10 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
27b20 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
27b30 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
27b40 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
27b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27b60 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
27b70 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
27b80 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
27b90 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
27ba0 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
27bb0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
27bc0 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
27bd0 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
27be0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
27bf0 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
27c00 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
27c10 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
27c20 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
27c30 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
27c40 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
27c50 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
27c60 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
27c70 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
27c80 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
27c90 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
27ca0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
27cb0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
27cc0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
27cd0 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
27ce0 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
27cf0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
27d00 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
27d10 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
27d20 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
27d30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27d40 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
27d50 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
27d60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27d70 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
27d80 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
27d90 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
27da0 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
27db0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
27dc0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
27dd0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
27de0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
27df0 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
27e00 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
27e10 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
27e20 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
27e30 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
27e40 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
27e50 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
27e60 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
27e70 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
27e80 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
27e90 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
27ea0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
27eb0 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
27ec0 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  nt freePage(MemP
27ed0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  age *pPage){.  r
27ee0 65 74 75 72 6e 20 66 72 65 65 50 61 67 65 32 28  eturn freePage2(
27ef0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
27f00 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
27f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
27f20 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
27f30 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
27f40 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
27f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27f60 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
27f70 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
27f80 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
27f90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
27fa0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
27fb0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
27fc0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
27fd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
27fe0 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76   nOvfl;.  u16 ov
27ff0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
28000 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28010 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
28020 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
28030 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
28040 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
28050 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
28060 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
28070 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28080 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
28090 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
280a0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
280b0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
280c0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
280d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
280e0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
280f0 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
28100 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
28110 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
28120 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
28130 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
28140 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
28150 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
28160 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
28170 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
28180 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
28190 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
281a0 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
281b0 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
281c0 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
281d0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
281e0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
281f0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
28200 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61  ovflPgno>pagerPa
28210 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
28220 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
28230 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
28240 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
28250 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
28260 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
28270 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
28280 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
28290 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
282a0 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
282b0 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
282c0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
282d0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
282e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
282f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
28300 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
28310 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
28320 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
28330 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
28340 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
28350 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28360 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
28370 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
28380 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
28390 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66  o);.    if( pOvf
283a0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
283b0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
283c0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
283d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
283e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
283f0 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
28400 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
28410 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28420 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
28430 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
28440 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
28450 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
28460 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
28470 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
28480 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
28490 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
284a0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
284b0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
284c0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
284d0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
284e0 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
284f0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
28500 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
28510 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
28520 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
28530 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
28540 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
28550 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
28560 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
28570 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
28580 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
28590 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
285a0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
285b0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
285c0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
285d0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
285e0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
285f0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
28600 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
28610 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
28620 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
28630 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
28640 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
28650 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28660 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
28670 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
28680 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
28690 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
286a0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
286b0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
286c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
286d0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
286e0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
286f0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
28700 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
28710 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
28720 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28740 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
28750 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
28760 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
28770 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
28780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
28790 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
287a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
287b0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
287c0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
287d0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
287e0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
287f0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
28800 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
28810 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
28820 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
28830 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
28840 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
28850 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
28860 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
28870 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
28880 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
28890 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
288a0 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
288b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
288c0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
288d0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
288e0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
288f0 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
28900 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
28910 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
28920 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
28930 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
28940 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
28950 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
28960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
28970 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
28980 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
28990 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
289a0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
289b0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
289c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
289d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
289e0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
289f0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
28a00 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
28a10 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
28a20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
28a30 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
28a40 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
28a50 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
28a60 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
28a70 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
28a80 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
28a90 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
28aa0 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
28ab0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
28ac0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
28ad0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
28ae0 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
28af0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
28b00 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
28b10 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
28b20 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
28b30 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
28b40 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
28b50 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
28b60 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
28b70 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
28b80 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
28b90 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
28ba0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
28bb0 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
28bc0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
28bd0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
28be0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
28bf0 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
28c00 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
28c10 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66   NEVER(nKey>0x7f
28c20 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
28c30 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
28c40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28c50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
28c60 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
28c70 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
28c80 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
28c90 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
28ca0 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
28cb0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
28cc0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
28cd0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
28ce0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
28cf0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
28d00 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
28d10 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
28d20 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
28d30 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
28d40 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
28d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
28d60 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
28d70 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
28d80 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
28d90 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
28da0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
28db0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
28dc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
28dd0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
28de0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
28df0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
28e00 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
28e10 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
28e20 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
28e30 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
28e40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
28e50 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28e60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
28e70 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
28e80 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
28e90 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
28ea0 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
28eb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28ec0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
28ed0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
28ee0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
28ef0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
28f00 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
28f10 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
28f20 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
28f30 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
28f40 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
28f50 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
28f60 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
28f70 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
28f80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
28f90 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
28fa0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
28fb0 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
28fc0 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
28fd0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
28fe0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
28ff0 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
29000 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
29010 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
29020 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
29030 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
29040 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
29050 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
29060 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
29070 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
29080 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
29090 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
290a0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
290b0 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
290c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
290d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
290e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
290f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
29100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
29110 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
29120 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
29130 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
29140 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
29150 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
29160 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
29170 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
29180 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
291a0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
291b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
291c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
291d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
291e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
291f0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
29200 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29210 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
29220 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
29230 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
29240 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
29250 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
29260 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
29270 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
29280 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
29290 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
292a0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
292b0 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
292c0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
292d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
292e0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
292f0 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
29300 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
29310 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
29320 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
29330 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
29340 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
29350 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
29360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
29370 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
29380 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
29390 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
293a0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
293b0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
293c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
293d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
293e0 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
293f0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
29400 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
29410 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
29420 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
29430 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
29440 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
29450 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
29460 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
29470 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
29480 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
29490 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
294a0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
294b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
294c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
294d0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
294e0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
294f0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
29500 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
29510 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
29520 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
29530 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
29540 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
29550 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
29560 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
29570 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
29580 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
29590 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
295a0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
295b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
295c0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
295d0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
295e0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
295f0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
29600 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
29610 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
29620 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
29630 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
29640 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
29650 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
29660 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
29670 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
29680 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
29690 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
296a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
296b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
296c0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
296d0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
296e0 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
296f0 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
29700 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
29710 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
29720 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
29730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29740 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
29750 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
29760 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
29770 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
29780 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
29790 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
297a0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
297b0 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
297c0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
297d0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
297e0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
297f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
29800 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
29810 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
29820 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29830 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
29840 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
29850 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
29860 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
29870 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
29880 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
29890 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
298a0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
298b0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
298c0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
298d0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
298e0 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
298f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
29900 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
29910 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
29920 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
29930 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
29940 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
29950 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
29960 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
29970 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
29980 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
29990 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
299a0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74  int *pRC){.  int
299b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
299c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
299d0 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
299e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
299f0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
29a00 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
29a10 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
29a20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
29a30 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
29a40 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
29a50 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
29a60 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
29a70 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
29a80 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
29a90 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
29aa0 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
29ab0 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
29ac0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
29ad0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
29ae0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
29af0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
29b00 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
29b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29b20 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29b30 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
29b40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29b50 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
29b60 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
29b70 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
29b80 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
29b90 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
29ba0 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
29bb0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
29bc0 70 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c  ptr);.  if( (pc<
29bd0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
29be0 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  +6+pPage->childP
29bf0 74 72 53 69 7a 65 29 0a 20 20 20 20 20 7c 7c 20  trSize).     || 
29c00 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42  (pc+sz>pPage->pB
29c10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 29  t->usableSize) )
29c20 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
29c30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29c40 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
29c50 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
29c60 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
29c70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
29c80 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
29c90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
29ca0 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
29cb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
29cc0 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
29cd0 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
29ce0 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
29cf0 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
29d00 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
29d10 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
29d20 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
29d30 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
29d40 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
29d50 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 2;.}../*.** In
29d60 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
29d70 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
29d80 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
29d90 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
29da0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
29db0 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
29dc0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
29dd0 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
29de0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
29df0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
29e00 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
29e10 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
29e20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
29e30 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
29e40 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
29e50 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
29e60 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
29e70 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
29e80 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
29e90 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
29ea0 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
29eb0 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
29ec0 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
29ed0 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
29ee0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
29ef0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
29f00 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
29f10 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
29f20 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
29f30 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
29f40 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
29f50 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
29f60 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
29f70 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
29f80 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
29f90 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
29fa0 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
29fb0 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
29fc0 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
29fd0 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
29fe0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
29ff0 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
2a000 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2a010 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
2a020 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
2a030 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
2a040 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
2a050 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
2a060 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
2a070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
2a080 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
2a090 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2a0a0 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
2a0b0 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
2a0c0 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
2a0d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
2a0e0 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
2a0f0 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
2a100 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
2a110 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
2a120 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
2a130 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
2a140 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
2a150 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
2a160 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
2a170 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
2a180 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
2a190 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
2a1a0 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
2a1b0 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
2a1c0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
2a1d0 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
2a1e0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
2a1f0 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
2a200 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
2a210 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
2a220 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
2a230 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
2a240 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
2a250 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
2a260 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
2a270 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
2a280 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
2a290 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2a2a0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65  unter */.  int e
2a2b0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
2a2c0 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
2a2d0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
2a2e0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2a2f0 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
2a300 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2a310 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
2a320 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
2a330 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
2a340 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
2a350 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
2a360 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
2a370 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2a380 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2a390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
2a3a0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
2a3b0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
2a3c0 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
2a3d0 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
2a3e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
2a3f0 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
2a400 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20  ..  int nSkip = 
2a410 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29  (iChild ? 4 : 0)
2a420 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  ;..  if( *pRC ) 
2a430 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2a440 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
2a450 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
2a460 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
2a470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a480 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
2a490 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
2a4a0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2a4b0 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
2a4c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2a4d0 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
2a4e0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29  (pPage->aOvfl) )
2a4f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
2a500 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2a510 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
2a520 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a530 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2a540 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2a550 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2a560 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
2a570 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
2a580 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
2a590 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
2a5a0 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
2a5b0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2a5c0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
2a5d0 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
2a5e0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2a5f0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
2a600 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  ell, iChild);.  
2a610 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
2a620 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
2a630 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69      assert( j<(i
2a640 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65  nt)(sizeof(pPage
2a650 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
2a660 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
2a670 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
2a680 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
2a690 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
2a6a0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
2a6b0 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73  = (u16)i;.  }els
2a6c0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
2a6d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a6e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a6f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2a700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a710 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2a720 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2a730 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2a740 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2a750 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2a760 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
2a770 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2a780 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
2a790 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
2a7a0 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
2a7b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
2a7c0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2a7d0 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
2a7e0 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d   + 2*i;.    rc =
2a7f0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
2a800 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
2a810 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
2a820 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
2a830 3b 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ; }.    assert( 
2a840 69 64 78 3e 3d 65 6e 64 2b 32 20 29 3b 0a 20 20  idx>=end+2 );.  
2a850 20 20 69 66 28 20 69 64 78 2b 73 7a 20 3e 20 70    if( idx+sz > p
2a860 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2a870 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2a  eSize ){.      *
2a880 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
2a890 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2a8a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2a8b0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
2a8c0 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
2a8d0 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
2a8e0 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
2a8f0 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
2a900 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
2a910 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
2a920 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2a930 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
2a940 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
2a950 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
2a960 3d 65 6e 64 2c 20 70 74 72 3d 26 64 61 74 61 5b  =end, ptr=&data[
2a970 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
2a980 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
2a990 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
2a9a0 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
2a9b0 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
2a9c0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2a9d0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
2a9e0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
2a9f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2aa00 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
2aa10 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
2aa20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2aa30 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
2aa40 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
2aa50 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
2aa60 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
2aa70 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
2aa80 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2aa90 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
2aaa0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
2aab0 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
2aac0 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
2aad0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
2aae0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
2aaf0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
2ab00 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52  pPage, pCell, pR
2ab10 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
2ab20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
2ab30 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
2ab40 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
2ab50 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
2ab60 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
2ab70 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
2ab80 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
2ab90 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
2aba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2abb0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
2abc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2abd0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
2abe0 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
2abf0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
2ac00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
2ac10 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
2ac20 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
2ac30 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2ac40 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
2ac50 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
2ac60 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
2ac70 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
2ac80 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
2ac90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
2aca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2acb0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2acc0 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20  u8 *pCellptr;   
2acd0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2ace0 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
2acf0 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
2ad00 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
2ad10 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
2ad20 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20   body */.  u8 * 
2ad30 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
2ad40 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
2ad50 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2ad60 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
2ad70 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
2ad80 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
2ad90 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
2ada0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
2adb0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67  f header on pPag
2adc0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
2add0 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65   nUsable = pPage
2ade0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2adf0 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a  e; /* Usable siz
2ae00 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20  e of page */..  
2ae10 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ae20 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
2ae30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ae40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2ae50 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2ae60 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
2ae70 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d  l>=0 && nCell<=M
2ae80 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2ae90 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
2aea0 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20  age->pBt)<=5460 
2aeb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2aec0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2aed0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2aee0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
2aef0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
2af00 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
2af10 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
2af20 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
2af30 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
2af40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
2af50 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2af60 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29  r+5])==nUsable )
2af70 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20  ;..  pCellptr = 
2af80 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
2af90 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a  lOffset + nCell*
2afa0 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d  2];.  cellbody =
2afb0 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28   nUsable;.  for(
2afc0 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b  i=nCell-1; i>=0;
2afd0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c   i--){.    pCell
2afe0 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65  ptr -= 2;.    ce
2aff0 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b  llbody -= aSize[
2b000 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  i];.    put2byte
2b010 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62  (pCellptr, cellb
2b020 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ody);.    memcpy
2b030 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
2b040 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
2b050 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75  ze[i]);.  }.  pu
2b060 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b070 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70  +3], nCell);.  p
2b080 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2b090 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  r+5], cellbody);
2b0a0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
2b0b0 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55  -= (nCell*2 + nU
2b0c0 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79  sable - cellbody
2b0d0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
2b0e0 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a  l = (u16)nCell;.
2b0f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2b100 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
2b110 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
2b120 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
2b130 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
2b140 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
2b150 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2b160 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2b170 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2b180 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
2b190 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2b1a0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2b1b0 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
2b1c0 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
2b1d0 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
2b1e0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
2b1f0 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
2b200 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
2b210 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
2b220 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
2b230 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
2b240 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
2b250 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
2b260 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
2b270 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
2b280 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
2b290 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
2b2a0 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
2b2b0 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
2b2c0 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
2b2d0 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
2b2e0 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
2b2f0 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
2b300 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
2b310 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
2b320 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
2b330 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
2b340 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
2b350 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
2b360 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
2b370 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
2b380 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2b390 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
2b3a0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
2b3b0 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
2b3c0 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
2b3d0 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
2b3e0 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ce */...#ifndef 
2b3f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2b400 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
2b410 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
2b420 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
2b430 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
2b440 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
2b450 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
2b460 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
2b470 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
2b480 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
2b490 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
2b4a0 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
2b4b0 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
2b4c0 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
2b4d0 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
2b4e0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
2b4f0 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
2b500 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
2b510 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
2b520 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
2b530 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
2b540 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
2b550 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
2b560 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
2b570 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
2b580 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
2b590 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
2b5a0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
2b5b0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
2b5c0 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
2b5d0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
2b5e0 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
2b5f0 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
2b600 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
2b610 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
2b620 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
2b630 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
2b640 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
2b650 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
2b660 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
2b670 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
2b680 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
2b690 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
2b6a0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
2b6b0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
2b6c0 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
2b6d0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
2b6e0 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
2b6f0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2b700 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
2b710 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62  .** The pSpace b
2b720 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
2b730 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
2b740 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
2b750 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74  ivider.** cell t
2b760 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
2b770 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e  rted into pParen
2b780 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63  t. Such a cell c
2b790 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a  onsists of a 4.*
2b7a0 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  * byte page numb
2b7b0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  er followed by a
2b7c0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2b7d0 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68   integer. In oth
2b7e0 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20  er.** words, at 
2b7f0 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48  most 13 bytes. H
2b800 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20  ence the pSpace 
2b810 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
2b820 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79  t.** least 13 by
2b830 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
2b840 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2b850 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
2b860 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61   *pParent, MemPa
2b870 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
2b880 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72  Space){.  BtShar
2b890 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20  ed *const pBt = 
2b8a0 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f  pPage->pBt;    /
2b8b0 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73  * B-Tree Databas
2b8c0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2b8d0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b8f0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
2b900 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b930 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2b940 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20    Pgno pgnoNew; 
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b960 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2b970 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f  umber of pNew */
2b980 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2b990 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2b9a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2b9b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2b9c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2b9d0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
2b9e0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
2b9f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2ba00 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20  erflow==1 );..  
2ba10 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
2ba20 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  <=0 ) return SQL
2ba30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2ba40 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2ba50 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69   a new page. Thi
2ba60 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
2ba70 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62  me the right-sib
2ba80 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50  ling of .  ** pP
2ba90 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  age. Make the pa
2baa0 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62  rent page writab
2bab0 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20  le, so that the 
2bac0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
2bad0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73  .  ** may be ins
2bae0 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74  erted. If both t
2baf0 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  hese operations 
2bb00 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20  are successful, 
2bb10 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
2bb20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2bb30 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
2bb40 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
2bb50 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  0);..  if( rc==S
2bb60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
2bb70 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70   u8 *pOut = &pSp
2bb80 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a  ace[4];.    u8 *
2bb90 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
2bba0 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
2bbb0 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20     u16 szCell = 
2bbc0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2bbd0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75  e, pCell);.    u
2bbe0 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61  8 *pStop;..    a
2bbf0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2bc00 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2bc10 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  New->pDbPage) );
2bc20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2bc30 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50  ge->aData[0]==(P
2bc40 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2bc50 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
2bc60 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
2bc70 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45  (pNew, PTF_INTKE
2bc80 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
2bc90 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73  TF_LEAF);.    as
2bca0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
2bcb0 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43   1, &pCell, &szC
2bcc0 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ell);..    /* If
2bcd0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2bce0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2bcf0 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2bd00 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20  nter map.    ** 
2bd10 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
2bd20 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
2bd30 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
2bd40 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  rom the .    ** 
2bd50 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
2bd60 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2bd70 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20  page. If either 
2bd80 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20  of these.    ** 
2bd90 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73  operations fails
2bda0 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  , the return cod
2bdb0 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68  e is set, but th
2bdc0 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a  e contents.    *
2bdd0 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  * of the parent 
2bde0 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d  page are still m
2bdf0 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68  anipulated by th
2be00 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20  h code below..  
2be10 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c    ** That is Ok,
2be20 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   at this point t
2be30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
2be40 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  s guaranteed to.
2be50 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64      ** be marked
2be60 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72   as dirty. Retur
2be70 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
2be80 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a  de will cause a.
2be90 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c      ** rollback,
2bea0 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61   undoing any cha
2beb0 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
2bec0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
2bed0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2bee0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2bef0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2bf00 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
2bf10 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
2bf20 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
2bf30 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70      if( szCell>p
2bf40 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b  New->minLocal ){
2bf50 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
2bf60 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20  utOvflPtr(pNew, 
2bf70 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20  pCell, &rc);.   
2bf80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
2bf90 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69    /* Create a di
2bfa0 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e  vider cell to in
2bfb0 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e  sert into pParen
2bfc0 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63  t. The divider c
2bfd0 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  ell.    ** consi
2bfe0 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20  sts of a 4-byte 
2bff0 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65  page number (the
2c000 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2c010 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a  pPage) and.    *
2c020 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  * a variable len
2c030 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77  gth key value (w
2c040 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65  hich must be the
2c050 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74   same value as t
2c060 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73  he.    ** larges
2c070 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e  t key on pPage).
2c080 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2c090 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65  o find the large
2c0a0 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20  st key value on 
2c0b0 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e  pPage, first fin
2c0c0 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  d the right-most
2c0d0 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
2c0e0 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73   pPage. The firs
2c0f0 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20  t two fields of 
2c100 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68  this cell are th
2c110 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64  e .    ** record
2c120 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61  -length (a varia
2c130 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2c140 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69  er at most 32-bi
2c150 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20  ts in size).    
2c160 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76  ** and the key v
2c170 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65  alue (a variable
2c180 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c   length integer,
2c190 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61   may have any va
2c1a0 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65  lue)..    ** The
2c1b0 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68   first of the wh
2c1c0 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62  ile(...) loops b
2c1d0 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20  elow skips over 
2c1e0 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74  the record-lengt
2c1f0 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20  h.    ** field. 
2c200 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65  The second while
2c210 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65  (...) loop copie
2c220 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  s the key value 
2c230 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
2c240 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e  cell on pPage in
2c250 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
2c260 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ffer..    */.   
2c270 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2c280 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
2c290 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53  nCell-1);.    pS
2c2a0 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
2c2b0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70  .    while( (*(p
2c2c0 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26  Cell++)&0x80) &&
2c2d0 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
2c2e0 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
2c2f0 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
2c300 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20  ( ((*(pOut++) = 
2c310 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30  *(pCell++))&0x80
2c320 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2c330 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65   );..    /* Inse
2c340 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  rt the new divid
2c350 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61  er cell into pPa
2c360 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73  rent. */.    ins
2c370 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
2c380 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c   pParent->nCell,
2c390 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70   pSpace, (int)(p
2c3a0 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20  Out-pSpace),.   
2c3b0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
2c3c0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  Page->pgno, &rc)
2c3d0 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
2c3e0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  e right-child po
2c3f0 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74  inter of pParent
2c400 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2c410 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
2c420 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
2c430 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2c440 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2c450 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20  , pgnoNew);.  . 
2c460 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
2c470 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2c480 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
2c490 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c4a0 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNew);.  }..  re
2c4b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
2c4c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2c4d0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f  _QUICKBALANCE */
2c4e0 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68  ..#if 0./*.** Th
2c4f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
2c500 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
2c510 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
2c520 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c  operation of SQL
2c530 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f  ite..** it is so
2c540 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65  metimes activate
2c550 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68  d temporarily wh
2c560 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f  ile debugging co
2c570 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a  de responsible .
2c580 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70  ** for setting p
2c590 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2c5a0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2c5b0 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67  t ptrmapCheckPag
2c5c0 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50  es(MemPage **apP
2c5d0 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  age, int nPage){
2c5e0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66  .  int i, j;.  f
2c5f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b  or(i=0; i<nPage;
2c600 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20   i++){.    Pgno 
2c610 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20  n;.    u8 e;.   
2c620 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2c630 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20  = apPage[i];.   
2c640 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2c650 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20   pPage->pBt;.   
2c660 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c670 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66  isInit );..    f
2c680 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d  or(j=0; j<pPage-
2c690 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  >nCell; j++){.  
2c6a0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2c6b0 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a  o;.      u8 *z;.
2c6c0 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20       .      z = 
2c6d0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2c6e0 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  j);.      btreeP
2c6f0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2c700 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  e, z, &info);.  
2c710 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
2c720 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
2c730 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
2c740 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69  t4byte(&z[info.i
2c750 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
2c760 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2c770 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29  t, ovfl, &e, &n)
2c780 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c790 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2c7a0 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56   && e==PTRMAP_OV
2c7b0 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20  ERFLOW1 );.     
2c7c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
2c7d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2c7e0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2c7f0 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20  = get4byte(z);. 
2c800 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
2c810 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2c820 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2c830 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2c840 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2c850 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20  P_BTREE );.     
2c860 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
2c870 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2c880 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
2c890 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  d = get4byte(&pP
2c8a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2c8b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2c8c0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74  .      ptrmapGet
2c8d0 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c  (pBt, child, &e,
2c8e0 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65   &n);.      asse
2c8f0 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2c900 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2c910 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20  BTREE );.    }. 
2c920 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2c930 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
2c940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c950 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65  used to copy the
2c960 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2c970 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f   b-tree node sto
2c980 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20  red .** on page 
2c990 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2c9a0 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d  o. If page pFrom
2c9b0 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20   was not a leaf 
2c9c0 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  page, then.** th
2c9d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2c9e0 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63  tries for each c
2c9f0 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70  hild page are up
2ca00 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2ca10 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65  e.** parent page
2ca20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
2ca30 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61  ointer map is pa
2ca40 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d  ge pTo. If pFrom
2ca50 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e   contained.** an
2ca60 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65  y cells with ove
2ca70 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
2ca80 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
2ca90 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e  rresponding poin
2caa0 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
2cab0 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61  es are also upda
2cac0 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ted so that the 
2cad0 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70  parent page is p
2cae0 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49  age pTo..**.** I
2caf0 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65  f pFrom is curre
2cb00 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e  ntly carrying an
2cb10 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  y overflow cells
2cb20 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65   (entries in the
2cb30 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66  .** MemPage.aOvf
2cb40 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
2cb50 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
2cb60 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
2cb70 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
2cb80 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
2cb90 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
2cba0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
2cbb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66  ..**.** The perf
2cbc0 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20  ormance of this 
2cbd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
2cbe0 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20  critical. It is 
2cbf0 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a  only used by .**
2cc00 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61   the balance_sha
2cc10 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c  llower() and bal
2cc20 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72  ance_deeper() pr
2cc30 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65  ocedures, neithe
2cc40 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72  r of.** which ar
2cc50 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75  e called often u
2cc60 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
2cc70 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74  umstances..*/.st
2cc80 61 74 69 63 20 69 6e 74 20 63 6f 70 79 4e 6f 64  atic int copyNod
2cc90 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65  eContent(MemPage
2cca0 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65   *pFrom, MemPage
2ccb0 20 2a 70 54 6f 29 7b 0a 20 20 42 74 53 68 61 72   *pTo){.  BtShar
2ccc0 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
2ccd0 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 75   pFrom->pBt;.  u
2cce0 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20  8 * const aFrom 
2ccf0 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a  = pFrom->aData;.
2cd00 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f    u8 * const aTo
2cd10 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20   = pTo->aData;. 
2cd20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d   int const iFrom
2cd30 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72  Hdr = pFrom->hdr
2cd40 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 63 6f  Offset;.  int co
2cd50 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70  nst iToHdr = ((p
2cd60 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31  To->pgno==1) ? 1
2cd70 30 30 20 3a 20 30 29 3b 0a 20 20 69 6e 74 20 72  00 : 0);.  int r
2cd80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2cd90 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 61   int iData;..  a
2cda0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
2cdb0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
2cdc0 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d  ( pFrom->nFree>=
2cdd0 69 54 6f 48 64 72 20 29 3b 0a 20 20 61 73 73 65  iToHdr );.  asse
2cde0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
2cdf0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
2ce00 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  <=pBt->usableSiz
2ce10 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  e );..  /* Copy 
2ce20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
2ce30 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
2ce40 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
2ce50 70 54 6f 2e 20 2a 2f 0a 20 20 69 44 61 74 61 20  pTo. */.  iData 
2ce60 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
2ce70 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
2ce80 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
2ce90 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
2cea0 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
2ceb0 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 6d  Size-iData);.  m
2cec0 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64  emcpy(&aTo[iToHd
2ced0 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  r], &aFrom[iFrom
2cee0 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c  Hdr], pFrom->cel
2cef0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f  lOffset + 2*pFro
2cf00 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a  m->nCell);..  /*
2cf10 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
2cf20 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
2cf30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cf40 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
2cf50 74 75 72 65 0a 20 20 2a 2a 20 6d 61 74 63 68 20  ture.  ** match 
2cf60 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68  the new data. Th
2cf70 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
2cf80 20 6f 66 20 70 54 6f 20 22 63 61 6e 6e 6f 74 22   of pTo "cannot"
2cf90 20 66 61 69 6c 2c 20 61 73 20 74 68 65 0a 20 20   fail, as the.  
2cfa0 2a 2a 20 64 61 74 61 20 63 6f 70 69 65 64 20 66  ** data copied f
2cfb0 72 6f 6d 20 70 46 72 6f 6d 20 69 73 20 6b 6e 6f  rom pFrom is kno
2cfc0 77 6e 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 20  wn to be valid. 
2cfd0 20 2a 2f 0a 20 20 70 54 6f 2d 3e 69 73 49 6e 69   */.  pTo->isIni
2cfe0 74 20 3d 20 30 3b 0a 20 20 54 45 53 54 4f 4e 4c  t = 0;.  TESTONL
2cff0 59 28 72 63 20 3d 20 29 20 62 74 72 65 65 49 6e  Y(rc = ) btreeIn
2d000 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61  itPage(pTo);.  a
2d010 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2d020 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  E_OK );..  /* If
2d030 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2d040 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2d050 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2d060 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2d070 0a 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d  .  ** for any b-
2d080 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
2d090 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
2d0a0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
2d0b0 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f   pointers to. */
2d0c0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2d0d0 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
2d0e0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2d0f0 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
2d100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d110 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
2d120 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
2d130 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
2d140 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
2d150 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
2d160 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
2d170 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
2d180 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
2d190 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
2d1a0 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
2d1b0 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
2d1c0 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
2d1d0 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
2d1e0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2d1f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
2d200 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
2d210 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
2d220 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
2d230 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
2d240 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
2d250 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
2d260 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
2d270 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
2d280 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
2d290 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
2d2a0 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
2d2b0 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
2d2c0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2d2d0 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
2d2e0 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
2d2f0 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
2d300 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
2d310 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
2d320 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2d330 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
2d340 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
2d350 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
2d360 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
2d370 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
2d380 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
2d390 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
2d3a0 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
2d3b0 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
2d3c0 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
2d3d0 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
2d3e0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
2d3f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2d400 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
2d410 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
2d420 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
2d430 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
2d440 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
2d450 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
2d460 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
2d470 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
2d480 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
2d490 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
2d4a0 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
2d4b0 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
2d4c0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
2d4d0 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
2d4e0 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
2d4f0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2d500 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
2d510 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
2d520 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2d530 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
2d540 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
2d550 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
2d560 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2d570 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
2d580 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
2d590 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
2d5a0 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
2d5b0 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
2d5c0 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
2d5d0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
2d5e0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2d5f0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
2d600 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
2d610 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
2d620 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
2d630 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
2d640 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
2d650 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
2d660 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
2d670 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
2d680 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
2d690 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
2d6a0 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
2d6b0 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
2d6c0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2d6d0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
2d6e0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
2d6f0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
2d700 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
2d710 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2d720 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
2d730 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
2d740 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
2d750 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
2d760 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
2d770 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
2d780 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
2d790 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
2d7a0 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
2d7b0 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
2d7c0 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
2d7d0 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
2d7e0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
2d7f0 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
2d800 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
2d810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d820 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
2d830 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
2d840 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
2d850 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
2d860 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
2d870 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
2d880 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
2d890 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
2d8a0 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
2d8b0 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
2d8c0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
2d8d0 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
2d8e0 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
2d8f0 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
2d900 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
2d910 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
2d920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
2d930 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
2d940 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
2d950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2d960 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
2d970 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
2d980 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
2d990 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65  nroot(.  MemPage
2d9a0 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
2d9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
2d9c0 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69  nt page of sibli
2d9d0 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ngs being balanc
2d9e0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ed */.  int iPar
2d9f0 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20  entIdx,         
2da00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2da10 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69   of "the page" i
2da20 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75  n pParent */.  u
2da30 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20  8 *aOvflSpace,  
2da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2da50 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  * page-size byte
2da60 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70  s of space for p
2da70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20  arent ovfl */.  
2da80 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20 20  int isRoot      
2da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2daa0 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
2dab0 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67  nt is a root-pag
2dac0 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  e */.){.  BtShar
2dad0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2dae0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
2daf0 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
2db00 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
2db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2db20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
2db30 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
2db40 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
2db50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2db60 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
2db70 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
2db80 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
2db90 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dbb0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2dbc0 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
2dbd0 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dbf0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2dc00 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
2dc10 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
2dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dc30 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2dc40 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
2dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc60 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
2dc70 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
2dc80 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
2dc90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2dca0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  K;          /* T
2dcb0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2dcc0 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72  /.  u16 leafCorr
2dcd0 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
2dce0 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
2dcf0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
2dd00 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
2dd10 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
2dd20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2dd30 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2dd40 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
2dd50 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
2dd60 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
2dd70 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
2dd80 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
2dd90 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
2dda0 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2ddc0 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
2ddd0 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
2dde0 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
2ddf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
2de00 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
2de10 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
2de20 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
2de30 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ace1 = 0;       
2de40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
2de50 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
2de60 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pace1[] */.  int
2de70 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b   iOvflSpace = 0;
2de80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2de90 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
2dea0 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a  f aOvflSpace[] *
2deb0 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63  /.  int szScratc
2dec0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2ded0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61   /* Size of scra
2dee0 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65  tch memory reque
2def0 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  sted */.  MemPag
2df00 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
2df10 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2df20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
2df30 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50  blings */.  MemP
2df40 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
2df50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
2df60 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
2df70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
2df80 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
2df90 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
2dfa0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2dfb0 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
2dfc0 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
2dfd0 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20    u8 *pRight;   
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dff0 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61  * Location in pa
2e000 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69  rent of right-si
2e010 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f  bling pointer */
2e020 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d  .  u8 *apDiv[NB-
2e030 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
2e040 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
2e050 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2e060 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
2e070 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
2e080 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
2e090 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
2e0a0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
2e0b0 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2e0d0 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
2e0e0 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
2e0f0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
2e100 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
2e110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2e120 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
2e130 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2e140 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2e150 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2e160 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2e170 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2e180 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31  */.  u8 *aSpace1
2e190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e1a0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
2e1b0 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
2e1c0 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e  s cells */.  Pgn
2e1d0 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
2e1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2e1f0 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61  p var to store a
2e200 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2e210 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72  */..  pBt = pPar
2e220 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  ent->pBt;.  asse
2e230 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e240 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2e250 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2e260 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e270 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2e280 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69  >pDbPage) );..#i
2e290 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41  f 0.  TRACE(("BA
2e2a0 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
2e2b0 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
2e2c0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2e2d0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
2e2e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
2e2f0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50  At this point pP
2e300 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61  arent may have a
2e310 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66  t most one overf
2e320 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66  low cell. And if
2e330 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66  .  ** this overf
2e340 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73  low cell is pres
2e350 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ent, it must be 
2e360 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20  the cell with . 
2e370 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e   ** index iParen
2e380 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61  tIdx. This scena
2e390 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  rio comes about 
2e3a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2e3b0 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  on.  ** is calle
2e3c0 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66  d (indirectly) f
2e3d0 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
2e3e0 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20  Delete()..  */. 
2e3f0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
2e400 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
2e410 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  | pParent->nOver
2e420 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73  flow==1 );.  ass
2e430 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
2e440 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
2e450 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
2e460 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78 20  idx==iParentIdx 
2e470 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c  );..  if( !aOvfl
2e480 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74  Space ){.    ret
2e490 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2e4a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
2e4b0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
2e4c0 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41  es to balance. A
2e4d0 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63  lso locate the c
2e4e0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
2e4f0 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64  .  ** that divid
2e500 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20  e the siblings. 
2e510 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
2e520 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69  de to find NN si
2e530 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20  blings on .  ** 
2e540 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2e550 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69  Page. More sibli
2e560 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ngs are taken fr
2e570 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77  om one side, how
2e580 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74  ever, .  ** if t
2e590 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
2e5a0 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
2e5b0 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
2e5c0 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  e. If pParent.  
2e5d0 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
2e5e0 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
2e5f0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
2e600 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
2e610 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  en.  .  **.  ** 
2e620 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64  This loop also d
2e630 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72  rops the divider
2e640 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20   cells from the 
2e650 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69  parent page. Thi
2e660 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20  s.  ** way, the 
2e670 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
2e680 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2e690 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20  ot have to deal 
2e6a0 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76  with any.  ** ov
2e6b0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20  erflow cells in 
2e6c0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
2e6d0 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78   since if any ex
2e6e0 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a  isted they will.
2e6f0 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64    ** have alread
2e700 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a  y been removed..
2e710 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65    */.  i = pPare
2e720 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20  nt->nOverflow + 
2e730 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a  pParent->nCell;.
2e740 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20    if( i<2 ){.   
2e750 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
2e760 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65  nOld = i+1;.  }e
2e770 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  lse{.    nOld = 
2e780 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65  3;.    if( iPare
2e790 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20  ntIdx==0 ){     
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
2e7b0 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
2e7c0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72    }else if( iPar
2e7d0 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20  entIdx==i ){.   
2e7e0 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a     nxDiv = i-2;.
2e7f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e800 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74   nxDiv = iParent
2e810 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  Idx-1;.    }.   
2e820 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66   i = 2;.  }.  if
2e830 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
2e840 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
2e850 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2e860 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
2e870 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2e880 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2e890 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
2e8a0 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
2e8b0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2e8c0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2e8d0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
2e8e0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2e8f0 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
2e900 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
2e910 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2e920 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
2e930 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
2e940 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  c ){.      memse
2e950 74 28 61 70 4f 6c 64 2c 20 30 2c 20 69 2a 73 69  t(apOld, 0, i*si
2e960 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
2e970 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  .      goto bala
2e980 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2e990 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73   }.    nMaxCells
2e9a0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
2e9b0 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
2e9c0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
2e9d0 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72  f( (i--)==0 ) br
2e9e0 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b  eak;..    if( i+
2e9f0 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
2ea00 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20  aOvfl[0].idx && 
2ea10 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2ea20 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ow ){.      apDi
2ea30 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e  v[i] = pParent->
2ea40 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
2ea50 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
2ea60 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
2ea70 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
2ea80 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2ea90 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
2eaa0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
2eab0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
2eac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ead0 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
2eae0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2eaf0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2eb00 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20  Overflow);.     
2eb10 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2eb20 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
2eb30 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
2eb40 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
2eb50 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20  , apDiv[i]);..  
2eb60 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
2eb70 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61  cell from the pa
2eb80 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76  rent page. apDiv
2eb90 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  [i] still points
2eba0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
2ebb0 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65   cell within the
2ebc0 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68   parent, even th
2ebd0 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e  ough it has been
2ebe0 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20   dropped..      
2ebf0 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20  ** This is safe 
2ec00 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67  because dropping
2ec10 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65   a cell only ove
2ec20 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73  rwrites the firs
2ec30 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
2ec40 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64  bytes of it, and
2ec50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
2ec60 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65  oes not need the
2ec70 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
2ec80 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68  four bytes of th
2ec90 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  e divider cell. 
2eca0 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  So the pointer i
2ecb0 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20  s safe to use.  
2ecc0 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e      ** later on.
2ecd0 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20    .      **.    
2ece0 20 20 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69    ** Unless SQLi
2ecf0 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69  te is compiled i
2ed00 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
2ed10 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  mode. In this ca
2ed20 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  se,.      ** the
2ed30 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74   dropCell() rout
2ed40 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ine will overwri
2ed50 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  te the entire ce
2ed60 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a  ll with zeroes..
2ed70 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
2ed80 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69   case, temporari
2ed90 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c  ly copy the cell
2eda0 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53   into the aOvflS
2edb0 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  pace[].      ** 
2edc0 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20  buffer. It will 
2edd0 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67  be copied out ag
2ede0 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ain as soon as t
2edf0 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66  he aSpace[] buff
2ee00 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  er.      ** is a
2ee10 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 23 69  llocated.  */.#i
2ee20 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
2ee30 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  RE_DELETE.      
2ee40 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61  memcpy(&aOvflSpa
2ee50 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72  ce[apDiv[i]-pPar
2ee60 65 6e 74 2d 3e 61 44 61 74 61 5d 2c 20 61 70 44  ent->aData], apD
2ee70 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29  iv[i], szNew[i])
2ee80 3b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  ;.      apDiv[i]
2ee90 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61   = &aOvflSpace[a
2eea0 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d  pDiv[i]-pParent-
2eeb0 3e 61 44 61 74 61 5d 3b 0a 23 65 6e 64 69 66 0a  >aData];.#endif.
2eec0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
2eed0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2eee0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2eef0 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72  ow, szNew[i], &r
2ef00 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
2ef10 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
2ef20 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
2ef30 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   4 in order to p
2ef40 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
2ef50 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
2ef60 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
2ef70 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e  nMaxCells + 3)&~
2ef80 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  3;..  /*.  ** Al
2ef90 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
2efa0 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
2efb0 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42  es.  */.  k = pB
2efc0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f  t->pageSize + RO
2efd0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
2efe0 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74  age));.  szScrat
2eff0 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78  ch =.       nMax
2f000 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
2f010 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2f020 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
2f030 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
2f040 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36  Cells*sizeof(u16
2f050 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2f060 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
2f070 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  l */.     + pBt-
2f080 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20  >pageSize       
2f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0a0 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
2f0b0 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e  e1 */.     + k*n
2f0c0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2f0f0 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29   copies (apCopy)
2f100 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
2f110 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
2f120 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29  loc( szScratch )
2f130 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  ; .  if( apCell=
2f140 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
2f150 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2f160 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2f170 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
2f180 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
2f190 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
2f1a0 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a    aSpace1 = (u8*
2f1b0 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
2f1c0 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ls];.  assert( E
2f1d0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2f1e0 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a  ENT(aSpace1) );.
2f1f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
2f200 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
2f210 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
2f220 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
2f230 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
2f240 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
2f250 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
2f260 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
2f270 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2f280 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
2f290 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
2f2a0 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
2f2b0 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
2f2c0 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
2f2d0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
2f2e0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
2f2f0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
2f300 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
2f310 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
2f320 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
2f330 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
2f340 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
2f350 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
2f360 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
2f370 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
2f380 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
2f390 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
2f3a0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
2f3b0 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
2f3c0 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
2f3d0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
2f3e0 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
2f3f0 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
2f400 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
2f410 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2f420 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
2f430 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2f440 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
2f450 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
2f460 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
2f470 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2f480 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
2f490 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
2f4a0 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
2f4b0 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
2f4c0 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
2f4d0 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
2f4e0 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
2f4f0 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
2f500 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61   = apOld[0]->lea
2f510 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
2f520 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44  = apOld[0]->hasD
2f530 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ata;.  for(i=0; 
2f540 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
2f550 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
2f560 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
2f570 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
2f580 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
2f590 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
2f5a0 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
2f5b0 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
2f5c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2f5d0 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
2f5e0 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
2f5f0 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
2f600 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2f610 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
2f620 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
2f630 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
2f640 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
2f650 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
2f660 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2f670 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
2f680 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
2f690 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
2f6a0 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
2f6b0 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
2f6c0 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
2f6d0 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
2f6e0 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
2f6f0 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
2f700 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
2f710 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
2f720 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
2f730 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
2f740 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
2f750 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
2f760 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
2f770 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
2f780 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
2f790 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2f7a0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
2f7b0 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
2f7c0 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
2f7d0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2f7e0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2f7f0 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65  pOld, apCell[nCe
2f800 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c  ll]);.      nCel
2f810 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  l++;.    }.    i
2f820 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21  f( i<nOld-1 && !
2f830 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20  leafData){.     
2f840 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73   u16 sz = (u16)s
2f850 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75  zNew[i];.      u
2f860 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
2f870 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
2f880 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
2f890 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2f8a0 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70   sz;.      pTemp
2f8b0 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61   = &aSpace1[iSpa
2f8c0 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61  ce1];.      iSpa
2f8d0 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce1 += sz;.     
2f8e0 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
2f8f0 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
2f900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
2f910 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65  pace1<=pBt->page
2f920 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65  Size );.      me
2f930 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
2f940 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
2f950 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
2f960 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
2f970 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73  ction;.      ass
2f980 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2f990 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f  ion==0 || leafCo
2f9a0 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
2f9b0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2f9c0 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c  l] = szCell[nCel
2f9d0 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74  l] - leafCorrect
2f9e0 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
2f9f0 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
2fa00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2fa10 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2fa20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2fa30 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  t( pOld->hdrOffs
2fa40 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  et==0 );.       
2fa50 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
2fa60 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2fa70 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
2fa80 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
2fa90 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
2faa0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2fab0 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
2fac0 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
2fad0 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
2fae0 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[8], 4);.     
2faf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fb00 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
2fb10 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
2fb20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
2fb30 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
2fb40 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2fb50 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20  allow any cells 
2fb60 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62  smaller than 4 b
2fb70 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ytes. */.       
2fb80 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
2fb90 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 4;.        }.
2fba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
2fbb0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell++;.    }.  }
2fbc0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75  ..  /*.  ** Figu
2fbd0 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65  re out the numbe
2fbe0 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65  r of pages neede
2fbf0 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43  d to hold all nC
2fc00 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20  ell cells..  ** 
2fc10 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65  Store this numbe
2fc20 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20  r in "k".  Also 
2fc30 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20  compute szNew[] 
2fc40 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74  which is the tot
2fc50 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  al.  ** size of 
2fc60 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  all cells on the
2fc70 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63   i-th page and c
2fc80 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  ntNew[] which is
2fc90 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
2fca0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74  in apCell[] of t
2fcb0 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76  he cell that div
2fcc0 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d  ides page i from
2fcd0 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a   page i+1.  .  *
2fce0 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75  * cntNew[k] shou
2fcf0 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a  ld equal nCell..
2fd00 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73    **.  ** Values
2fd10 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69   computed by thi
2fd20 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20  s block:.  **.  
2fd30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20  **           k: 
2fd40 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  The total number
2fd50 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65   of sibling page
2fd60 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b  s.  **    szNew[
2fd70 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20  i]: Spaced used 
2fd80 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  on the i-th sibl
2fd90 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20  ing page..  **  
2fda0 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65   cntNew[i]: Inde
2fdb0 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  x in apCell[] an
2fdc0 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74  d szCell[] for t
2fdd0 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  he first cell to
2fde0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2fdf0 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20     the right of 
2fe00 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
2fe10 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62   page..  ** usab
2fe20 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20  leSpace: Number 
2fe30 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2fe40 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65  e available on e
2fe50 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a  ach sibling..  *
2fe60 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65  * .  */.  usable
2fe70 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61  Space = pBt->usa
2fe80 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c  bleSize - 12 + l
2fe90 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
2fea0 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d   for(subtotal=k=
2feb0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
2fec0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2fed0 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  i<nMaxCells );. 
2fee0 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73     subtotal += s
2fef0 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20  zCell[i] + 2;.  
2ff00 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e    if( subtotal >
2ff10 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a   usableSpace ){.
2ff20 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d        szNew[k] =
2ff30 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65   subtotal - szCe
2ff40 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74  ll[i];.      cnt
2ff50 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20  New[k] = i;.    
2ff60 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
2ff70 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73  { i--; }.      s
2ff80 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20  ubtotal = 0;.   
2ff90 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66     k++;.      if
2ffa0 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d  ( k>NB+1 ){ rc =
2ffb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
2ffc0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2ffd0 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20  eanup; }.    }. 
2ffe0 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
2fff0 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
30000 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
30010 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
30020 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
30030 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
30040 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
30050 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
30060 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
30070 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
30080 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
30090 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
300a0 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
300b0 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
300c0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
300d0 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
300e0 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
300f0 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
30100 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
30110 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
30120 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
30130 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
30140 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
30150 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
30160 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
30170 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
30180 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
30190 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
301a0 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
301b0 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
301c0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
301d0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
301e0 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
301f0 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
30200 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
30210 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
30220 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
30230 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
30240 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
30250 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
30260 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
30270 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
30280 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
30290 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
302a0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
302b0 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
302c0 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
302d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
302e0 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
302f0 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
30300 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
30310 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
30320 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
30330 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
30340 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
30350 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
30360 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
30370 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
30380 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
30390 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
303a0 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
303b0 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
303c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
303d0 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
303e0 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
303f0 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
30400 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
30410 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
30420 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
30430 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
30440 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
30450 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
30460 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
30470 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
30480 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
30490 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
304a0 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
304b0 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
304c0 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
304d0 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
304e0 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
304f0 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
30500 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73  )>0) or pPage is
30510 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
30520 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
30530 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
30540 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
30550 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
30560 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
30570 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
30580 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
30590 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
305a0 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
305b0 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
305c0 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
305d0 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52  ell==0) );..  TR
305e0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
305f0 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
30600 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
30610 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
30620 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
30630 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
30640 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
30650 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
30660 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
30670 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
30680 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
30690 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
306a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
306b0 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
306c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
306d0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 67 6f  _CORRUPT;.    go
306e0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
306f0 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c  up;.  }.  pageFl
30700 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ags = apOld[0]->
30710 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
30720 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
30730 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
30740 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
30750 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
30760 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
30770 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
30780 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
30790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
307a0 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
307b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
307c0 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
307d0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
307e0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
307f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
30800 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
30810 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
30820 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
30830 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c  ew, &pgno, pgno,
30840 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
30850 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
30860 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
30870 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
30880 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
30890 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
308a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
308b0 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
308c0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
308d0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
308e0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
308f0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
30900 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
30910 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
30920 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
30930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30950 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
30960 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
30970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30980 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
30990 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
309a0 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
309b0 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
309c0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
309d0 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
309e0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61   rc = freePage(a
309f0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
30a00 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
30a10 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
30a20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
30a30 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
30a40 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
30a50 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
30a60 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
30a70 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
30a80 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
30a90 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
30aa0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
30ab0 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
30ac0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
30ad0 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
30ae0 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
30af0 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
30b00 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
30b10 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
30b20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
30b30 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
30b40 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
30b50 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
30b60 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
30b70 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
30b80 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
30b90 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
30ba0 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
30bb0 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
30bc0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
30bd0 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
30be0 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
30bf0 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
30c00 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
30c10 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
30c20 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
30c30 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
30c40 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
30c50 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
30c60 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
30c70 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
30c80 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
30c90 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
30ca0 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
30cb0 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
30cc0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
30cd0 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
30ce0 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
30cf0 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
30d00 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
30d10 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
30d20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
30d30 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
30d40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
30d50 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
30d60 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
30d70 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
30d80 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
30d90 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
30da0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e  ew[i];.      apN
30db0 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
30dc0 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
30dd0 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
30de0 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
30df0 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28  "new: %d(%d) %d(
30e00 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
30e10 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
30e20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c   apNew[0]->pgno,
30e30 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
30e40 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31  New>=2 ? apNew[1
30e50 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
30e60 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
30e70 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
30e80 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e   ? apNew[2]->pgn
30e90 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  o : 0, nNew>=3 ?
30ea0 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
30eb0 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e     nNew>=4 ? apN
30ec0 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[3]->pgno : 0,
30ed0 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
30ee0 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
30ef0 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d  w>=5 ? apNew[4]-
30f00 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
30f10 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
30f20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0));..  assert( 
30f30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
30f40 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
30f50 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70  >pDbPage) );.  p
30f60 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20  ut4byte(pRight, 
30f70 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70  apNew[nNew-1]->p
30f80 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  gno);..  /*.  **
30f90 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
30fa0 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
30fb0 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
30fc0 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
30fd0 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
30fe0 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
30ff0 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
31000 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
31010 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
31020 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
31030 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
31040 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
31050 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
31060 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
31070 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
31080 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
31090 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
310a0 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
310b0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
310c0 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
310d0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
310e0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
310f0 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
31100 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
31110 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
31120 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
31130 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
31140 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74   );..    j = cnt
31150 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
31160 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
31170 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
31180 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
31190 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
311a0 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
311b0 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
311c0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
311d0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
311e0 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77    assert( i<nNew
311f0 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29  -1 || j==nCell )
31200 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c  ;.    if( j<nCel
31210 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
31220 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
31230 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
31240 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
31250 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
31260 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
31270 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
31280 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
31290 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
312a0 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  n;.      pTemp =
312b0 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76   &aOvflSpace[iOv
312c0 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  flSpace];.      
312d0 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
312e0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
312f0 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
31300 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
31310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
31320 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
31330 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
31340 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
31350 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
31360 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
31370 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
31380 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
31390 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
313a0 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
313b0 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
313c0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
313d0 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
313e0 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
313f0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
31400 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
31410 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
31420 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
31430 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
31440 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
31450 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
31460 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
31470 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
31480 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
31490 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
314a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
314b0 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  p;.        sz = 
314c0 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70  4 + putVarint(&p
314d0 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b  Cell[4], info.nK
314e0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ey);.        pTe
314f0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
31500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
31510 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
31520 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
31530 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
31540 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
31550 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
31560 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
31570 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
31580 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
31590 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
315a0 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
315b0 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
315c0 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
315d0 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
315e0 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
315f0 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61   ** (see btreePa
31600 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
31610 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
31620 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
31630 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
31640 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
31650 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
31660 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
31670 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
31680 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
31690 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
316a0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
316b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
316c0 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
316d0 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
316e0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
316f0 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
31700 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
31710 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
31720 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
31730 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
31740 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
31750 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
31760 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
31770 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
31780 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31790 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
317a0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
317b0 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
317c0 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
317d0 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
317e0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
317f0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
31800 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
31810 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a  iOvflSpace += sz
31820 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31830 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
31840 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
31850 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c  ert( iOvflSpace<
31860 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
31870 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
31880 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
31890 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
318a0 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
318b0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
318c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
318d0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
318e0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
318f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
31900 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
31910 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
31920 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
31930 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
31940 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
31950 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
31960 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
31970 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
31980 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
31990 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
319a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
319b0 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
319c0 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
319d0 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
319e0 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
319f0 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
31a00 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
31a10 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
31a20 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
31a30 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
31a40 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
31a50 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
31a60 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
31a70 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
31a80 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
31a90 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
31aa0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
31ab0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
31ac0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
31ad0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
31ae0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
31af0 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
31b00 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
31b10 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
31b20 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
31b30 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
31b40 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
31b50 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
31b60 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
31b70 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
31b80 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
31b90 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
31ba0 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
31bb0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
31bc0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
31bd0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
31be0 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
31bf0 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
31c00 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
31c10 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
31c20 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
31c30 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
31c40 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
31c50 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
31c60 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
31c70 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
31c80 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
31c90 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
31ca0 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
31cb0 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
31cc0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
31cd0 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
31ce0 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
31cf0 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
31d00 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
31d10 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
31d20 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
31d30 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
31d40 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
31d50 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
31d60 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
31d70 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
31d80 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
31d90 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
31da0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
31db0 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
31dc0 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
31dd0 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
31de0 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
31df0 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
31e00 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
31e10 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28   .    );.    if(
31e20 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
31e30 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  = copyNodeConten
31e40 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72  t(apNew[0], pPar
31e50 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 20 20 72  ent)) ){.      r
31e60 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4e  c = freePage(apN
31e70 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[0]);.    }.  
31e80 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f  }else if( ISAUTO
31e90 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a  VACUUM ){.    /*
31ea0 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   Fix the pointer
31eb0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
31ec0 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74   all the cells t
31ed0 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64  hat were shifted
31ee0 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a   around. .    **
31ef0 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72   There are sever
31f00 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70  al different typ
31f10 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61  es of pointer-ma
31f20 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e  p entries that n
31f30 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
31f40 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
31f50 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d  his routine. Som
31f60 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20  e of these have 
31f70 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79  been set already
31f80 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e  , but.    ** man
31f90 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20  y have not. The 
31fa0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73  following is a s
31fb0 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20  ummary:.    **. 
31fc0 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65     **   1) The e
31fd0 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
31fe0 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69  d with new sibli
31ff0 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ng pages that we
32000 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20  re not.    **   
32010 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e     siblings when
32020 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
32030 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65  as called. These
32040 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
32050 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73    **      been s
32060 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65  et. We don't nee
32070 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  d to worry about
32080 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68   old siblings th
32090 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20  at were.    **  
320a0 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65      moved to the
320b0 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65   free-list - the
320c0 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65   freePage() code
320d0 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a   has taken care.
320e0 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74      **      of t
320f0 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  hose..    **.   
32100 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69   **   2) The poi
32110 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
32120 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
32130 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
32140 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  low.    **      
32150 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72  page in any over
32160 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64  flow chains used
32170 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20   by new divider 
32180 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20  cells. These .  
32190 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61    **      have a
321a0 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e  lso already been
321b0 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62   taken care of b
321c0 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c  y the insertCell
321d0 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a  () code..    **.
321e0 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74      **   3) If t
321f0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
32200 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
32210 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
32220 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  pages of.    ** 
32230 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65       cells store
32240 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67  d on the sibling
32250 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20   pages may need 
32260 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
32270 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34     **.    **   4
32280 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
32290 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69   pages are not i
322a0 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e  nternal intkey n
322b0 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20  odes, then any. 
322c0 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66     **      overf
322d0 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20 62  low pages used b
322e0 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61  y these cells ma
322f0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
32300 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  ated.    **     
32310 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65   (internal intke
32320 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f  y nodes never co
32330 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
32340 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
32350 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
32360 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69 62     5) If the sib
32370 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
32380 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
32390 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
323a0 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72      **      entr
323b0 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68  ies for the righ
323c0 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  t-child pages of
323d0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61   each sibling ma
323e0 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20  y need.    **   
323f0 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64     to be updated
32400 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32410 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61 72  Cases 1 and 2 ar
32420 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f  e dealt with abo
32430 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65  ve by other code
32440 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  . The next.    *
32450 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  * block deals wi
32460 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34  th cases 3 and 4
32470 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74   and the one aft
32480 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e  er that, case 5.
32490 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65   Since.    ** se
324a0 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  tting a pointer 
324b0 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20 72  map entry is a r
324c0 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73  elatively expens
324d0 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74  ive operation, t
324e0 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  his.    ** code 
324f0 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65  only sets pointe
32500 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
32510 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  r child or overf
32520 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 68  low pages that h
32530 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  ave.    ** actua
32540 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65  lly moved betwee
32550 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20  n pages.  */.   
32560 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
32570 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d   apNew[0];.    M
32580 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
32590 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e  pCopy[0];.    in
325a0 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f  t nOverflow = pO
325b0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
325c0 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20     int iNextOld 
325d0 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  = pOld->nCell + 
325e0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
325f0 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  nt iOverflow = (
32600 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64  nOverflow ? pOld
32610 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a  ->aOvfl[0].idx :
32620 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b   -1);.    j = 0;
32630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32650 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69  Current 'old' si
32660 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
32670 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20    k = 0;        
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32690 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
326a0 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61  'new' sibling pa
326b0 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ge */.    for(i=
326c0 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26 20 72 63  0; i<nCell && rc
326d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
326e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  ){.      int isD
326f0 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  ivider = 0;.    
32700 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78    while( i==iNex
32710 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tOld ){.        
32720 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
32730 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
32740 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
32750 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64  last cell on old
32760 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
32770 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74  ing page j. If t
32780 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
32790 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
327a0 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
327b0 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
327c0 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61  hen cell i was a
327d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a   divider cell. *
327e0 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d  /.        pOld =
327f0 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20   apCopy[++j];.  
32800 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d        iNextOld =
32810 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
32820 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70   pOld->nCell + p
32830 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
32840 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
32850 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
32860 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c           nOverfl
32870 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
32880 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  flow;.          
32890 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20  iOverflow = i + 
328a0 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
328b0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a  ->aOvfl[0].idx;.
328c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
328d0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c    isDivider = !l
328e0 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20  eafData;  .     
328f0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
32900 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  (nOverflow>0 || 
32910 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20  iOverflow<i );. 
32920 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
32930 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d  rflow<2 || pOld-
32940 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
32950 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
32960 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x-1);.      asse
32970 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c  rt(nOverflow<3 |
32980 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  | pOld->aOvfl[1]
32990 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66  .idx==pOld->aOvf
329a0 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20  l[2].idx-1);.   
329b0 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66     if( i==iOverf
329c0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  low ){.        i
329d0 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20  sDivider = 1;.  
329e0 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76        if( (--nOv
329f0 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20  erflow)>0 ){.   
32a00 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
32a10 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
32a20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
32a30 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b   i==cntNew[k] ){
32a40 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
32a50 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
32a60 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
32a70 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
32a80 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20  ll on new.      
32a90 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
32aa0 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e k. If the sibl
32ab0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
32ac0 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
32ad0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
32ae0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
32af0 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72  l i is a divider
32b00 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   cell.  */.     
32b10 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
32b20 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  ++k];.        if
32b30 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f  ( !leafData ) co
32b40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
32b50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
32b60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
32b70 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
32b80 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
32b90 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
32ba0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
32bb0 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
32bc0 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
32bd0 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
32be0 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
32bf0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
32c00 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
32c10 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
32c20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
32c30 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
32c40 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
32c50 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
32c60 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
32c70 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
32c80 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
32c90 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
32ca0 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
32cb0 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
32cc0 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
32cd0 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
32ce0 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
32cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
32d00 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
32d10 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
32d20 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
32d30 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
32d40 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
32d50 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
32d60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32d70 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
32d80 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
32d90 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
32da0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
32db0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
32dc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32dd0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
32de0 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
32df0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
32e00 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
32e10 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
32e20 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
32e30 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
32e40 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
32e50 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
32e60 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
32e70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
32e80 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
32e90 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
32ea0 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
32eb0 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
32ec0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
32ed0 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
32ee0 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
32ef0 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
32f00 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
32f10 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
32f20 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
32f30 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
32f40 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
32f50 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
32f60 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
32f70 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
32f80 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
32f90 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
32fa0 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
32fb0 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
32fc0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
32fd0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
32fe0 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
32ff0 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
33000 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
33010 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
33020 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
33030 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
33040 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
33050 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
33060 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
33070 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
33080 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
33090 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
330a0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
330b0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
330c0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
330d0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
330e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
330f0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
33100 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
33110 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
33120 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
33130 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
33140 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
33150 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
33160 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f  lled when the ro
33170 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
33180 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
33190 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61  .** overfull (ha
331a0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
331b0 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a  erflow pages)..*
331c0 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64  *.** A new child
331d0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
331e0 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ed and the conte
331f0 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  nts of the curre
33200 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c  nt root.** page,
33210 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66   including overf
33220 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63  low cells, are c
33230 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
33240 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a  hild. The root.*
33250 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f  * page is then o
33260 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61  verwritten to ma
33270 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70  ke it an empty p
33280 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67  age with the rig
33290 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69  ht-child .** poi
332a0 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  nter pointing to
332b0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a   the new page..*
332c0 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
332d0 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74  rning, all point
332e0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
332f0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
33300 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74  pages .** that t
33310 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67  he new child-pag
33320 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70  e now contains p
33330 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75  ointers to are u
33340 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65  pdated. The.** e
33350 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
33360 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69  ng to the new ri
33370 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
33380 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  r of the root.**
33390 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70   page is also up
333a0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dated..**.** If 
333b0 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43  successful, *ppC
333c0 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63  hild is set to c
333d0 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
333e0 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  ce to the child 
333f0 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c  .** page and SQL
33400 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
33410 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
33420 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
33430 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61  equired.** to ca
33440 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
33450 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61   on *ppChild exa
33460 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e  ctly once. If an
33470 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
33480 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
33490 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
334a0 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
334b0 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
334c0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
334d0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  er(MemPage *pRoo
334e0 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43  t, MemPage **ppC
334f0 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  hild){.  int rc;
33500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33510 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
33520 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
33530 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
33540 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20  MemPage *pChild 
33550 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
33560 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
33570 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
33580 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
33590 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
335a0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
335b0 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
335c0 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
335d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f  ared *pBt = pRoo
335e0 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68  t->pBt;    /* Th
335f0 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73  e BTree */..  as
33600 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76  sert( pRoot->nOv
33610 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73  erflow>0 );.  as
33620 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
33630 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
33640 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tex) );..  /* Ma
33650 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f  ke pRoot, the ro
33660 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
33670 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e  -tree, writable.
33680 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
33690 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20  .  ** page that 
336a0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
336b0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
336c0 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74  of pPage. Copy t
336d0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
336e0 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f   of the node sto
336f0 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74  red on pRoot int
33700 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  o the new child 
33710 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  page..  */.  rc 
33720 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33730 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
33740 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
33750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33760 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
33770 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
33780 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
33790 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20  oot->pgno,0);.  
337a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
337b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
337c0 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  = copyNodeConten
337d0 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29  t(pRoot, pChild)
337e0 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  ;.      if( ISAU
337f0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
33800 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
33810 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54  t, pgnoChild, PT
33820 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f  RMAP_BTREE, pRoo
33830 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
33840 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
33850 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
33860 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20   *ppChild = 0;. 
33870 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
33880 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
33890 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
338a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
338b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
338c0 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
338d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
338e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
338f0 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
33900 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
33910 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
33920 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Root->nCell );..
33930 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
33940 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
33950 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f  into %d\n", pRoo
33960 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  t->pgno, pChild-
33970 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43  >pgno));..  /* C
33980 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  opy the overflow
33990 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f   cells from pRoo
339a0 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20  t to pChild */. 
339b0 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
339c0 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f  aOvfl, pRoot->aO
339d0 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  vfl, pRoot->nOve
339e0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f  rflow*sizeof(pRo
339f0 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ot->aOvfl[0]));.
33a00 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
33a10 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76  low = pRoot->nOv
33a20 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65  erflow;..  /* Ze
33a30 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ro the contents 
33a40 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69  of pRoot. Then i
33a50 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73  nstall pChild as
33a60 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
33a70 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28  . */.  zeroPage(
33a80 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61  pRoot, pChild->a
33a90 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
33aa0 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
33ab0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
33ac0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
33ad0 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
33ae0 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43  .  *ppChild = pC
33af0 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  hild;.  return S
33b00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
33b10 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  ** The page that
33b20 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20   pCur currently 
33b30 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75  points to has ju
33b40 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  st been modified
33b50 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e   in.** some way.
33b60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
33b70 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68  igures out if th
33b80 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  is modification 
33b90 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65  means the.** tre
33ba0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
33bb0 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73  lanced, and if s
33bc0 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72  o calls the appr
33bd0 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
33be0 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42  g .** routine. B
33bf0 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
33c00 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62  s are:.**.**   b
33c10 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a  alance_quick().*
33c20 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  *   balance_deep
33c30 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  er().**   balanc
33c40 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73  e_nonroot().*/.s
33c50 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
33c60 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
33c70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33c80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
33c90 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72   int nMin = pCur
33ca0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33cb0 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20  e * 2 / 3;.  u8 
33cc0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
33cd0 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46  ce[13];.  u8 *pF
33ce0 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54  ree = 0;..  TEST
33cf0 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63  ONLY( int balanc
33d00 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d  e_quick_called =
33d10 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   0 );.  TESTONLY
33d20 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  ( int balance_de
33d30 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20  eper_called = 0 
33d40 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  );..  do {.    i
33d50 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
33d60 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50  >iPage;.    MemP
33d70 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
33d80 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
33d90 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
33da0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
33db0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
33dc0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  w ){.        /* 
33dd0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
33de0 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f   the b-tree is o
33df0 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
33e00 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20   case call the. 
33e10 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63         ** balanc
33e20 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74  e_deeper() funct
33e30 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20  ion to create a 
33e40 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68  new child for th
33e50 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
33e60 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20      ** and copy 
33e70 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
33e80 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
33e90 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  -page to it. The
33ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74  .        ** next
33eb0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
33ec0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62  e do-loop will b
33ed0 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64  alance the child
33ee0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
33ef0 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  / .        asser
33f00 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  t( (balance_deep
33f10 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  er_called++)==0 
33f20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
33f30 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
33f40 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50  Page, &pCur->apP
33f50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  age[1]);.       
33f60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33f70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33f80 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b  pCur->iPage = 1;
33f90 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
33fa0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
33fb0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
33fc0 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[1] = 0;.   
33fd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
33fe0 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e  Cur->apPage[1]->
33ff0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20  nOverflow );.   
34000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
34010 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
34020 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
34030 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e  else if( pPage->
34040 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
34050 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d  pPage->nFree<=nM
34060 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  in ){.      brea
34070 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
34080 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f      MemPage * co
34090 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43  nst pParent = pC
340a0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
340b0 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  -1];.      int c
340c0 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72  onst iIdx = pCur
340d0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d  ->aiIdx[iPage-1]
340e0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
340f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34100 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
34110 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
34120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
34130 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34140 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
34150 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
34160 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20  ->hasData.      
34170 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76     && pPage->nOv
34180 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20  erflow==1.      
34190 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76     && pPage->aOv
341a0 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
341b0 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
341c0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
341d0 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  o!=1.         &&
341e0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
341f0 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b  =iIdx.        ){
34200 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
34210 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ll balance_quick
34220 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  () to create a n
34230 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50  ew sibling of pP
34240 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  age on which.   
34250 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f         ** to sto
34260 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  re the overflow 
34270 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75  cell. balance_qu
34280 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20  ick() inserts a 
34290 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20  new cell.       
342a0 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65     ** into pPare
342b0 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
342c0 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72  use pParent over
342d0 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20  flow. If this.  
342e0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
342f0 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74  ns, the next int
34300 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
34310 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
34320 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20  nce pParent .   
34330 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69         ** use ei
34340 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ther balance_non
34350 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63  root() or balanc
34360 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69  e_deeper(). Unti
34370 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  l this.         
34380 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
34390 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
343a0 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
343b0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
343c0 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  ce[].          *
343d0 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20  * buffer. .     
343e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
343f0 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65    ** The purpose
34400 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
34410 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f  g assert() is to
34420 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79   check that only
34430 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
34440 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62  single call to b
34450 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
34460 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20  s made for each 
34470 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
34480 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
34490 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  on. If this were
344a0 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61   not verified, a
344b0 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f   subtle bug invo
344c0 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20  lving reuse.    
344d0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
344e0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
344f0 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b  ce[] might sneak
34500 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a   in..          *
34510 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
34520 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69  rt( (balance_qui
34530 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  ck_called++)==0 
34540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
34550 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  = balance_quick(
34560 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20  pParent, pPage, 
34570 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
34580 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ce);.        }el
34590 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
345a0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    {.          /*
345b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63   In this case, c
345c0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  all balance_nonr
345d0 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72  oot() to redistr
345e0 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20  ibute cells.    
345f0 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
34600 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
34610 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e   2 of its siblin
34620 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e  g pages. This in
34630 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20  volves.         
34640 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   ** modifying th
34650 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
34660 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79  arent, which may
34670 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74   cause pParent t
34680 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
34690 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
346a0 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65  r underfull. The
346b0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
346c0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20  of the do-loop. 
346d0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c           ** will
346e0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
346f0 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72  ent page to corr
34700 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20  ect this..      
34710 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
34720 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65    ** If the pare
34730 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20  nt page becomes 
34740 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76  overfull, the ov
34750 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63  erflow cell or c
34760 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
34770 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
34780 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
34790 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65  r allocated imme
347a0 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a  diately below. .
347b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73            ** A s
347c0 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
347d0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
347e0 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74  op will deal wit
347f0 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20  h this by.      
34800 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62      ** calling b
34810 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
34820 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
34830 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  () may be called
34840 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20   first,.        
34850 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73    ** but it does
34860 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76  n't deal with ov
34870 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a  erflow cells - j
34880 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74  ust moves them t
34890 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  o a.          **
348a0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29   different page)
348b0 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73  . Once this subs
348c0 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62  equent call to b
348d0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
348e0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68   .          ** h
348f0 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74  as completed, it
34900 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65   is safe to rele
34910 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62  ase the pSpace b
34920 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20  uffer used by.  
34930 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
34940 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73  revious call, as
34950 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
34960 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76  ll data will hav
34970 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20  e been .        
34980 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68    ** copied eith
34990 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  er into the body
349a0 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
349b0 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20  age or into the 
349c0 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  new.          **
349d0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70   pSpace buffer p
349e0 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74  assed to the lat
349f0 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ter call to bala
34a00 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20  nce_nonroot().. 
34a10 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
34a20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65        u8 *pSpace
34a30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
34a40 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e  lloc(pCur->pBt->
34a50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
34a60 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
34a70 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e  e_nonroot(pParen
34a80 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c  t, iIdx, pSpace,
34a90 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20   iPage==1);.    
34aa0 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
34ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
34ac0 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f  * If pFree is no
34ad0 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74  t NULL, it point
34ae0 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  s to the pSpace 
34af0 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20  buffer used .   
34b00 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61           ** by a
34b10 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74   previous call t
34b20 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
34b30 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  t(). Its content
34b40 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20  s are.          
34b50 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20    ** now stored 
34b60 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64  either on real d
34b70 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72  atabase pages or
34b80 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20   within the .   
34b90 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20           ** new 
34ba0 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73  pSpace buffer, s
34bb0 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65  o it may be safe
34bc0 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a  ly freed here. *
34bd0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
34be0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
34bf0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
34c00 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
34c10 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
34c20 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  r will be freed 
34c30 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63  after the next c
34c40 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
34c50 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   ** balance_nonr
34c60 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62  oot(), or just b
34c70 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
34c80 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69  ion returns, whi
34c90 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20  chever.         
34ca0 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e   ** comes first.
34cb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46   */.          pF
34cc0 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20  ree = pSpace;.  
34cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
34ce0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
34cf0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
34d00 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
34d10 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
34d20 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65   do-loop balance
34d30 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  s the parent pag
34d40 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65  e. */.      rele
34d50 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
34d60 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67        pCur->iPag
34d70 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  e--;.    }.  }wh
34d80 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
34d90 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72  OK );..  if( pFr
34da0 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
34db0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
34dc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
34dd0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  c;.}.../*.** Ins
34de0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
34df0 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
34e00 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
34e10 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
34e20 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
34e30 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
34e40 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
34e50 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
34e60 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
34e70 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
34e80 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
34e90 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
34ea0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
34eb0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
34ec0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
34ed0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
34ee0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
34ef0 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
34f00 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
34f10 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
34f20 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
34f30 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
34f40 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
34f50 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
34f60 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  oth ignored..**.
34f70 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
34f80 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
34f90 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
34fa0 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
34fb0 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55  ll to.** MovetoU
34fc0 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65  npacked() to see
34fd0 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f  k cursor pCur to
34fe0 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61   (pKey, nKey) ha
34ff0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
35000 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65  n performed. see
35010 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73  kResult is the s
35020 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74  earch result ret
35030 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76  urned (a negativ
35040 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70  e.** number if p
35050 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
35060 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73   entry that is s
35070 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65  maller than (pKe
35080 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20  y, nKey), or.** 
35090 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
350a0 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20   if pCur points 
350b0 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20  at an etry that 
350c0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a  is larger than .
350d0 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29  ** (pKey, nKey))
350e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
350f0 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
35100 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
35110 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 20  cursor pCur may 
35120 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a 2a  point to any .**
35130 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20   entry or to no 
35140 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20 49 6e  entry at all. In
35150 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
35160 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20  function has to 
35170 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73  seek.** the curs
35180 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65  or before the ne
35190 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e 73  w key can be ins
351a0 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
351b0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
351c0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
351d0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
351e0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
351f0 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
35200 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
35210 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
35220 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
35230 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
35240 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
35250 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
35260 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
35270 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta,  /* The data
35280 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
35290 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  rd */.  int nZer
352a0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
352b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
352c0 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65   of extra 0 byte
352d0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64  s to append to d
352e0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70  ata */.  int app
352f0 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20 20  endBias,        
35300 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
35310 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c  if this is likel
35320 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20  y an append */. 
35330 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20   int seekResult 
35340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35350 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69  /* Result of pri
35360 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  or MovetoUnpacke
35370 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20  d() call */.){. 
35380 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
35390 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b  oc = seekResult;
353a0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
353b0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
353c0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
353d0 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
353e0 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
353f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
35400 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
35410 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
35420 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
35430 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ll = 0;..  if( p
35440 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
35450 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
35460 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
35470 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
35480 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OK );.    return
35490 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
354a0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
354b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
354c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
354d0 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
354e0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
354f0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
35500 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65 61  ITE && !pBt->rea
35510 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
35520 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
35530 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43  eTableLock(p, pC
35540 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
35550 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  ur->pKeyInfo!=0,
35560 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73   2) );..  /* Ass
35570 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
35580 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ler has been con
35590 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69 73  sistent. If this
355a0 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
355b0 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69 6e  ed.  ** expectin
355c0 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  g an index b-tre
355d0 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
355e0 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  er should be ins
355f0 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a  erting blob.  **
35600 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61 73   keys with no as
35610 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 49  sociated data. I
35620 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  f the cursor was
35630 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69 6e   opened expectin
35640 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65 79  g an.  ** intkey
35650 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c 6c   table, the call
35660 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  er should be ins
35670 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20 6b  erting integer k
35680 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a 20  eys with a.  ** 
35690 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61 74  blob of associat
356a0 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 61  ed data.  */.  a
356b0 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30 29  ssert( (pKey==0)
356c0 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
356d0 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
356e0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 73  f this is an ins
356f0 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ert into a table
35700 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69 64   b-tree, invalid
35710 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
35720 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f   .  ** cursors o
35730 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62  pen on the row b
35740 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28 61  eing replaced (a
35750 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20  ssuming this is 
35760 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f  a replace.  ** o
35770 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69 74  peration - if it
35780 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c   is not, the fol
35790 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f  lowing is a no-o
357a0 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  p).  */.  if( pC
357b0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
357c0 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
357d0 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
357e0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
357f0 6f 74 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  ot, nKey, 0);.  
35800 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
35810 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
35820 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
35830 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
35840 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  le..  **.  ** In
35850 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
35860 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d 6f   call to btreeMo
35870 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73 20  veto() below is 
35880 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a  a no-op. For.  *
35890 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  * example, when 
358a0 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20 69  inserting data i
358b0 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68  nto a table with
358c0 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20   auto-generated 
358d0 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79  integer.  ** key
358e0 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79 65  s, the VDBE laye
358f0 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  r invokes sqlite
35900 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f 20  3BtreeLast() to 
35910 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 0a  figure out the .
35920 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65 79    ** integer key
35930 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65 6e   to use. It then
35940 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
35950 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79  tion to actually
35960 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20 2a   insert the .  *
35970 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  * data into the 
35980 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20 49  intkey B-Tree. I
35990 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72 65  n this case btre
359a0 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e  eMoveto() recogn
359b0 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  izes.  ** that t
359c0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
359d0 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e 65  eady where it ne
359e0 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65  eds to be and re
359f0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20  turns without.  
35a00 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ** doing any wor
35a10 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61  k. To avoid thwa
35a20 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69  rting these opti
35a30 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73  mizations, it is
35a40 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20   important.  ** 
35a50 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65  not to clear the
35a60 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20   cursor here..  
35a70 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  */.  rc = saveAl
35a80 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
35a90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
35aa0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
35ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
35ac0 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63 20   !loc ){.    rc 
35ad0 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
35ae0 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
35af0 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
35b00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
35b10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
35b20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
35b30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
35b40 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53  LID || (pCur->eS
35b50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
35b60 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a  ALID && loc) );.
35b70 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
35b80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
35b90 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
35ba0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
35bb0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
35bc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
35bd0 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74  f || !pPage->int
35be0 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  Key );..  TRACE(
35bf0 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
35c00 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
35c10 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
35c20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
35c30 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
35c40 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
35c50 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
35c60 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
35c70 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
35c80 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
35c90 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
35ca0 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
35cb0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
35cc0 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
35cd0 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
35ce0 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
35cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
35d00 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
35d10 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
35d20 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
35d30 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
35d40 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
35d50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
35d60 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
35d70 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
35d80 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
35d90 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
35da0 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
35db0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
35dc0 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
35dd0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
35de0 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29  ;.  if( loc==0 )
35df0 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
35e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
35e10 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
35e20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35e30 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
35e40 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
35e50 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
35e60 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
35e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
35e80 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
35e90 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
35ea0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
35eb0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
35ec0 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
35ed0 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
35ee0 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
35ef0 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
35f00 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
35f10 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
35f20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64 72  oldCell);.    dr
35f30 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
35f40 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a  x, szOld, &rc);.
35f50 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
35f60 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
35f70 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
35f80 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
35f90 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
35fa0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
35fb0 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72      idx = ++pCur
35fc0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
35fd0 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age];.  }else{. 
35fe0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35ff0 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
36000 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
36010 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  , idx, newCell, 
36020 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26 72 63  szNew, 0, 0, &rc
36030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
36040 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
36050 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
36060 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36070 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  >0 );..  /* If n
36080 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
36090 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68 61  red and pPage ha
360a0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  s an overflow ce
360b0 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ll, call balance
360c0 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69  () .  ** to redi
360d0 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65 6c  stribute the cel
360e0 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  ls within the tr
360f0 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63  ee. Since balanc
36100 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a  e() may move.  *
36110 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65  * the cursor, ze
36120 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  ro the BtCursor.
36130 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42  info.nSize and B
36140 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65  tCursor.validNKe
36150 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  y.  ** variables
36160 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76  ..  **.  ** Prev
36170 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
36180 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d   SQLite called m
36190 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d  oveToRoot() to m
361a0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20  ove the cursor. 
361b0 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20   ** back to the 
361c0 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c  root page as bal
361d0 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20 69  ance() used to i
361e0 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f  nvalidate the co
361f0 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42  ntents.  ** of B
36200 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d  tCursor.apPage[]
36210 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69   and BtCursor.ai
36220 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f  Idx[]. Instead o
36230 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20  f doing that,.  
36240 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  ** set the curso
36250 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61  r state to "inva
36260 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73  lid". This makes
36270 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f   common insert o
36280 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73  perations.  ** s
36290 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a  lightly faster..
362a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20    **.  ** There 
362b0 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20  is a subtle but 
362c0 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69  important optimi
362d0 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e  zation here too.
362e0 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a   When inserting.
362f0 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65    ** multiple re
36300 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e  cords into an in
36310 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e  tkey b-tree usin
36320 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f  g a single curso
36330 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68  r (as can.  ** h
36340 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63  appen while proc
36350 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52  essing an "INSER
36360 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43  T INTO ... SELEC
36370 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69  T" statement), i
36380 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74  t.  ** is advant
36390 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20  ageous to leave 
363a0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
363b0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
363c0 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68  entry in.  ** th
363d0 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73  e b-tree if poss
363e0 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72  ible. If the cur
363f0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
36400 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
36410 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  .  ** entry in t
36420 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  he table, and th
36430 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72  e next row inser
36440 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67  ted has an integ
36450 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67  er key.  ** larg
36460 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
36470 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79  est existing key
36480 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
36490 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20   to insert the. 
364a0 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20   ** row without 
364b0 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73  seeking the curs
364c0 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20  or. This can be 
364d0 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63  a big performanc
364e0 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20  e boost..  */.  
364f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
36500 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
36510 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
36520 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36530 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
36540 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d  flow ){.    rc =
36550 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
36560 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b  .    /* Must mak
36570 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77  e sure nOverflow
36580 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72   is reset to zer
36590 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61  o even if the ba
365a0 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66  lance().    ** f
365b0 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64  ails. Internal d
365c0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
365d0 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65  rruption will re
365e0 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20  sult otherwise. 
365f0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65  .    ** Also, se
36600 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
36610 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54  te to invalid. T
36620 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43 75  his stops saveCu
36630 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20  rsorPosition(). 
36640 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
36650 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63 75  g to save the cu
36660 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
36670 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a  f the cursor.  *
36680 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  /.    pCur->apPa
36690 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
366a0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
366b0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
366c0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
366d0 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  D;.  }.  assert(
366e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
366f0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
36700 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64  rflow==0 );..end
36710 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
36720 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
36730 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
36740 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
36750 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
36760 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
36770 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
36780 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c  at a arbitrary l
36790 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ocation..*/.int 
367a0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
367b0 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  te(BtCursor *pCu
367c0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  r){.  Btree *p =
367d0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
367e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
367f0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
36800 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b        .  int rc;
36810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36830 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
36840 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
36850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36860 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
36870 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72  o delete cell fr
36880 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  om */.  unsigned
36890 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20   char *pCell;   
368a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
368b0 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20  Pointer to cell 
368c0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
368d0 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20  nt iCellIdx;    
368e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
36900 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
36910 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70  /.  int iCellDep
36920 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
36930 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74           /* Dept
36940 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69  h of node contai
36950 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a  ning pCell */ ..
36960 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
36970 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
36980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
36990 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
369a0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
369b0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
369c0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
369d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
369e0 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lag );.  assert(
369f0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
36a00 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
36a10 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
36a20 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
36a30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
36a40 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
36a50 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
36a60 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ot) );..  if( NE
36a70 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b  VER(pCur->aiIdx[
36a80 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43  pCur->iPage]>=pC
36a90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
36aa0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20  >iPage]->nCell) 
36ab0 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75  .   || NEVER(pCu
36ac0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
36ad0 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20  R_VALID).  ){.  
36ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36af0 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74  ERROR;  /* Somet
36b00 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77  hing has gone aw
36b10 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ry. */.  }..  /*
36b20 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
36b30 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74  lete operation t
36b40 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66  o remove a row f
36b50 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72  rom a table b-tr
36b60 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64  ee,.  ** invalid
36b70 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
36b80 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
36b90 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64   the row being d
36ba0 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66  eleted.  */.  if
36bb0 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  ( pCur->pKeyInfo
36bc0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  ==0 ){.    inval
36bd0 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
36be0 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67  sors(p, pCur->pg
36bf0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e  noRoot, pCur->in
36c00 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d  fo.nKey, 0);.  }
36c10 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d  ..  iCellDepth =
36c20 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
36c30 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d  iCellIdx = pCur-
36c40 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74  >aiIdx[iCellDept
36c50 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  h];.  pPage = pC
36c60 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c  ur->apPage[iCell
36c70 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20  Depth];.  pCell 
36c80 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
36c90 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20  , iCellIdx);..  
36ca0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  /* If the page c
36cb0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e  ontaining the en
36cc0 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73  try to delete is
36cd0 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
36ce0 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  , move.  ** the 
36cf0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
36d00 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74  rgest entry in t
36d10 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73 20  he tree that is 
36d20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a  smaller than.  *
36d30 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e  * the entry bein
36d40 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
36d50 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63  cell will replac
36d60 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  e the cell being
36d70 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72   deleted.  ** fr
36d80 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
36d90 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76 69  node. The 'previ
36da0 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75 73  ous' entry is us
36db0 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  ed for this inst
36dc0 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ead.  ** of the 
36dd0 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73  'next' entry, as
36de0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
36df0 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61 20  try is always a 
36e00 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
36e10 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64   sub-tree headed
36e20 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70 61   by the child pa
36e30 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62  ge of the cell b
36e40 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68  eing deleted. Th
36e50 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61  is makes.  ** ba
36e60 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65  lancing the tree
36e70 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
36e80 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
36e90 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66  easier.  */.  if
36ea0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
36eb0 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  {.    int notUse
36ec0 64 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  d;.    rc = sqli
36ed0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
36ee0 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  (pCur, &notUsed)
36ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
36f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
36f10 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
36f20 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
36f30 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
36f40 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62   on this table b
36f50 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e  efore.  ** makin
36f60 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  g any modificati
36f70 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  ons. Make the pa
36f80 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
36f90 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20  e entry to be . 
36fa0 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74   ** deleted writ
36fb0 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20  able. Then free 
36fc0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
36fd0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
36fe0 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74  th the .  ** ent
36ff0 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72  ry and finally r
37000 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69  emove the cell i
37010 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69  tself from withi
37020 6e 20 74 68 65 20 70 61 67 65 2e 20 20 0a 20 20  n the page.  .  
37030 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  */.  rc = saveAl
37040 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
37050 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
37060 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
37070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
37080 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37090 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
370a0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
370b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
370c0 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
370d0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 64 72 6f  e, pCell);.  dro
370e0 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  pCell(pPage, iCe
370f0 6c 6c 49 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  llIdx, cellSizeP
37100 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
37110 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63  , &rc);.  if( rc
37120 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
37130 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
37140 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f 74 20  deleted was not 
37150 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65 61  located on a lea
37160 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  f page, then the
37170 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73 20   cursor.  ** is 
37180 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
37190 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  ng to the larges
371a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  t entry in the s
371b0 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 0a 20  ub-tree headed. 
371c0 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69 6c 64   ** by the child
371d0 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63 65 6c  -page of the cel
371e0 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  l that was just 
371f0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e 20  deleted from an 
37200 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f  internal.  ** no
37210 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66 72 6f  de. The cell fro
37220 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  m the leaf node 
37230 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 76 65  needs to be move
37240 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
37250 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20 72  l.  ** node to r
37260 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c 65 74  eplace the delet
37270 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69  ed cell.  */.  i
37280 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
37290 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
372a0 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 61 70  pLeaf = pCur->ap
372b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
372c0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  ];.    int nCell
372d0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20 70  ;.    Pgno n = p
372e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c  Cur->apPage[iCel
372f0 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b  lDepth+1]->pgno;
37300 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
37310 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20 70  ar *pTmp;..    p
37320 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
37330 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43  pLeaf, pLeaf->nC
37340 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65 6c  ell-1);.    nCel
37350 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
37360 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a 20  pLeaf, pCell);. 
37370 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
37380 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e 43  LL_SIZE(pBt)>=nC
37390 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f  ell );..    allo
373a0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
373b0 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20 70  t);.    pTmp = p
373c0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  Bt->pTmpSpace;..
373d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
373e0 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66  PagerWrite(pLeaf
373f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
37400 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
37410 2c 20 69 43 65 6c 6c 49 64 78 2c 20 70 43 65 6c  , iCellIdx, pCel
37420 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c 20 70 54  l-4, nCell+4, pT
37430 6d 70 2c 20 6e 2c 20 26 72 63 29 3b 0a 20 20 20  mp, n, &rc);.   
37440 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 2c   dropCell(pLeaf,
37450 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c   pLeaf->nCell-1,
37460 20 6e 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20   nCell, &rc);.  
37470 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37480 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
37490 42 61 6c 61 6e 63 65 20 74 68 65 20 74 72 65 65  Balance the tree
374a0 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 20 64  . If the entry d
374b0 65 6c 65 74 65 64 20 77 61 73 20 6c 6f 63 61 74  eleted was locat
374c0 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67  ed on a leaf pag
374d0 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e,.  ** then the
374e0 20 63 75 72 73 6f 72 20 73 74 69 6c 6c 20 70 6f   cursor still po
374f0 69 6e 74 73 20 74 6f 20 74 68 61 74 20 70 61 67  ints to that pag
37500 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
37510 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 63  the first.  ** c
37520 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28 29  all to balance()
37530 20 72 65 70 61 69 72 73 20 74 68 65 20 74 72 65   repairs the tre
37540 65 2c 20 61 6e 64 20 74 68 65 20 69 66 28 2e 2e  e, and the if(..
37550 2e 29 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 0a  .) condition is.
37560 20 20 2a 2a 20 6e 65 76 65 72 20 74 72 75 65 2e    ** never true.
37570 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72  .  **.  ** Other
37580 77 69 73 65 2c 20 69 66 20 74 68 65 20 65 6e 74  wise, if the ent
37590 72 79 20 64 65 6c 65 74 65 64 20 77 61 73 20 6f  ry deleted was o
375a0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  n an internal no
375b0 64 65 20 70 61 67 65 2c 20 74 68 65 6e 0a 20 20  de page, then.  
375c0 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
375d0 69 6e 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20  ing to the leaf 
375e0 70 61 67 65 20 66 72 6f 6d 20 77 68 69 63 68 20  page from which 
375f0 61 20 63 65 6c 6c 20 77 61 73 20 72 65 6d 6f 76  a cell was remov
37600 65 64 20 74 6f 0a 20 20 2a 2a 20 72 65 70 6c 61  ed to.  ** repla
37610 63 65 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65  ce the cell dele
37620 74 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ted from the int
37630 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 69 73  ernal node. This
37640 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 2a   is slightly.  *
37650 2a 20 74 72 69 63 6b 79 20 61 73 20 74 68 65 20  * tricky as the 
37660 6c 65 61 66 20 6e 6f 64 65 20 6d 61 79 20 62 65  leaf node may be
37670 20 75 6e 64 65 72 66 75 6c 6c 2c 20 61 6e 64 20   underfull, and 
37680 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
37690 65 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 65 69  e may.  ** be ei
376a0 74 68 65 72 20 75 6e 64 65 72 20 6f 72 20 6f 76  ther under or ov
376b0 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
376c0 63 61 73 65 20 72 75 6e 20 74 68 65 20 62 61 6c  case run the bal
376d0 61 6e 63 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d  ancing algorithm
376e0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 61  .  ** on the lea
376f0 66 20 6e 6f 64 65 20 66 69 72 73 74 2e 20 49 66  f node first. If
37700 20 74 68 65 20 62 61 6c 61 6e 63 65 20 70 72 6f   the balance pro
37710 63 65 65 64 73 20 66 61 72 20 65 6e 6f 75 67 68  ceeds far enough
37720 20 75 70 20 74 68 65 0a 20 20 2a 2a 20 74 72 65   up the.  ** tre
37730 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 62 65  e that we can be
37740 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20 70   sure that any p
37750 72 6f 62 6c 65 6d 20 69 6e 20 74 68 65 20 69 6e  roblem in the in
37760 74 65 72 6e 61 6c 20 6e 6f 64 65 20 68 61 73 0a  ternal node has.
37770 20 20 2a 2a 20 62 65 65 6e 20 63 6f 72 72 65 63    ** been correc
37780 74 65 64 2c 20 73 6f 20 62 65 20 69 74 2e 20 4f  ted, so be it. O
37790 74 68 65 72 77 69 73 65 2c 20 61 66 74 65 72 20  therwise, after 
377a0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 6c 65  balancing the le
377b0 61 66 20 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77 61  af node,.  ** wa
377c0 6c 6b 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  lk the cursor up
377d0 20 74 68 65 20 74 72 65 65 20 74 6f 20 74 68 65   the tree to the
377e0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 61   internal node a
377f0 6e 64 20 62 61 6c 61 6e 63 65 20 69 74 20 61 73  nd balance it as
37800 20 0a 20 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f   .  ** well.  */
37810 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
37820 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
37830 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43  =SQLITE_OK && pC
37840 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44  ur->iPage>iCellD
37850 65 70 74 68 20 29 7b 0a 20 20 20 20 77 68 69 6c  epth ){.    whil
37860 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 69  e( pCur->iPage>i
37870 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20 20  CellDepth ){.   
37880 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37890 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
378a0 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
378b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61   }.    rc = bala
378c0 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  nce(pCur);.  }..
378d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
378e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
378f0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
37900 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37910 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
37920 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
37930 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
37940 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
37950 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
37960 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
37970 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
37980 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
37990 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
379a0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
379b0 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
379c0 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
379d0 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
379e0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
379f0 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
37a00 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
37a10 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
37a20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
37a30 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
37a40 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
37a50 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
37a60 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
37a70 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
37a80 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
37a90 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
37aa0 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
37ab0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
37ac0 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
37ad0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
37ae0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
37af0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
37b00 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
37b10 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
37b20 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
37b30 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
37b40 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
37b50 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
37b60 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
37b70 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
37b80 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
37b90 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
37ba0 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
37bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
37bc0 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
37bd0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
37be0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
37bf0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
37c00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
37c10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
37c20 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
37c30 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
37c40 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
37c50 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
37c60 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
37c70 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
37c80 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
37c90 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
37ca0 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
37cb0 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
37cc0 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
37cd0 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
37ce0 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
37cf0 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
37d00 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
37d10 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
37d20 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
37d30 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
37d40 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
37d50 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
37d60 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
37d70 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
37d80 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
37d90 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
37da0 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
37db0 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
37dc0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
37dd0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
37de0 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
37df0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
37e00 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
37e10 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
37e20 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
37e30 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
37e40 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
37e50 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
37e60 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
37e70 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
37e80 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
37e90 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
37ea0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
37eb0 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
37ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
37ed0 65 47 65 74 4d 65 74 61 28 70 2c 20 42 54 52 45  eGetMeta(p, BTRE
37ee0 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50  E_LARGEST_ROOT_P
37ef0 41 47 45 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  AGE, &pgnoRoot);
37f00 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
37f10 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
37f20 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
37f30 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
37f40 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
37f50 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
37f60 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
37f70 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
37f80 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f     while( pgnoRo
37f90 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
37fa0 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
37fb0 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
37fc0 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
37fd0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
37fe0 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
37ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
38000 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
38010 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
38020 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
38030 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
38040 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
38050 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
38060 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
38070 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
38080 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
38090 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
380a0 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
380b0 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
380c0 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
380d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
380e0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
380f0 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
38100 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
38110 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
38120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
38130 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
38140 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
38150 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
38160 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
38170 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
38180 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
38190 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
381a0 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
381b0 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
381c0 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
381d0 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
381e0 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
381f0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
38200 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
38210 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
38220 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
38230 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
38240 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
38250 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
38260 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
38270 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
38280 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
38290 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
382a0 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
382b0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
382c0 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
382d0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
382e0 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
382f0 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
38300 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
38310 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
38320 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  */.      rc = bt
38330 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
38340 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
38350 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
38360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
38370 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
38380 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
38390 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
383a0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
383b0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
383c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  e);.      if( eT
383d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
383e0 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  PAGE || eType==P
383f0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
38400 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
38410 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
38420 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
38430 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38440 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
38450 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
38460 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
38470 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
38480 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
38490 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
384a0 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
384b0 72 74 28 20 65 54 79 7