/ Hex Artifact Content
Login

Artifact dcdf6af667dfeae23eaf8fac7ace3caeed632c8b:


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 38 37 20 32 30 30 39 2f 30  c,v 1.687 2009/0
0190: 37 2f 31 34 20 31 37 3a 34 38 3a 30 36 20 64 72  7/14 17:48:06 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 3b 0a 20 20     int nPage;.  
43f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
4400: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
4410: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
4420: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
4430: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4440: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4450: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4460: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
4470: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
4480: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4490: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
44a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
44b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
44c0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
44d0: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
44e0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
44f0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4500: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
4510: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
4520: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4530: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
4540: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4550: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
4560: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4570: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
4580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4590: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
45a0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
45b0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
45c0: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
45d0: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
45e0: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
45f0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
4600: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
4610: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
4620: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
4630: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
4640: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
4650: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4660: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
4670: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4680: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4690: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
46a0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
46b0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
46c0: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
46d0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
46e0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
46f0: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
4700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
4710: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
4720: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4730: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
4740: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
4750: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
4760: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
4770: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
4780: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4790: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
47a0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
47b0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
47c0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
47d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
47e0: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
47f0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
4800: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
4810: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
4820: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
4830: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
4840: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
4850: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
4860: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
4870: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
4880: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
4890: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
48a0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
48b0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
48c0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
48d0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
48e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
48f0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4900: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4910: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4920: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4940: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4950: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
4960: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
4970: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
4980: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
4990: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
49a0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
49b0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
49c0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
49d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
49e0: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
49f0: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
4a00: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
4a10: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
4a20: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
4a30: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
4a40: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
4a50: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
4a60: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
4a70: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
4a80: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
4a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4aa0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
4ab0: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
4ac0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
4ad0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
4ae0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
4af0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
4b00: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
4b10: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
4b20: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
4b30: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
4b40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
4b50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4b60: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
4b70: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
4b80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4b90: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
4ba0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4bb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4bc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
4bd0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
4be0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4bf0: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
4c00: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
4c10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4c20: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4c30: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
4c40: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
4c50: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
4c60: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
4c70: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
4c80: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4c90: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
4ca0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
4cb0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
4cc0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
4cd0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
4ce0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4cf0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
4d00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
4d10: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
4d20: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
4d30: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
4d40: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
4d50: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
4d60: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
4d70: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
4d80: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
4d90: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
4da0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
4db0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
4dc0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
4dd0: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
4de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
4df0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
4e00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
4e10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
4e20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
4e30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
4e40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4e50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
4e60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4e70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
4e80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
4e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
4ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
4eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
4ec0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
4ed0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
4ee0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
4ef0: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
4f00: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f10: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
4f20: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
4f30: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
4f40: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
4f50: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
4f60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
4f70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
4fa0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
4fb0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
4fc0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
4fd0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
4fe0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
4ff0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5000: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5010: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5020: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
5030: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5040: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5050: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5060: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
5070: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
5080: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
5090: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
50a0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
50b0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
50c0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
50d0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
50e0: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
50f0: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
5100: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
5110: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
5120: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
5130: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
5140: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
5150: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
5160: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
5170: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
5180: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
5190: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
51a0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
51b0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
51c0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
51d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
51e0: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
51f0: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
5200: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
5210: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
5220: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
5230: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
5240: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
5250: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
5260: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
5270: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
5280: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
52b0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
52c0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
52d0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
52e0: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
52f0: 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20  aSpace[150];    
5300: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
5310: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
5320: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
5330: 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b  loc */..  if( pK
5340: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5350: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5360: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5370: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5380: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5390: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
53a0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
53b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
53e0: 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
53f0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
5400: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
5410: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
5420: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5430: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
5440: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
5450: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
5460: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
5470: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
5480: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  ( pKey ){.    sq
5490: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
54a0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49  npackedRecord(pI
54b0: 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  dxKey);.  }.  re
54c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
54d0: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
54e0: 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69  rsor to the posi
54f0: 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28  tion it was in (
5500: 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61  or as close to a
5510: 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77  s possible).** w
5520: 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f  hen saveCursorPo
5530: 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c  sition() was cal
5540: 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  led. Note that t
5550: 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73  his call deletes
5560: 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70   the .** saved p
5570: 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f  osition info sto
5580: 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f  red by saveCurso
5590: 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20  rPosition(), so 
55a0: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
55b0: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65  at most one effe
55c0: 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72  ctive restoreCur
55d0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
55e0: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
55f0: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
5600: 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  tion()..*/.stati
5610: 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f  c int btreeResto
5620: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5630: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5640: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
5650: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5660: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5670: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
5680: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5690: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
56a0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
56b0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
56c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
56d0: 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70  r->skip;.  }.  p
56e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
56f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
5700: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
5710: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
5720: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
5730: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a  , &pCur->skip);.
5740: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5750: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5760: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5770: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
5780: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
5790: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
57a0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
57b0: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
57c0: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
57d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
57e0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
57f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5800: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
5810: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5820: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
5830: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
5840: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5850: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
5860: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
5870: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
5880: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5890: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
58a0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
58b0: 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  on it.** was las
58c0: 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75  t placed at.  Cu
58d0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
58e0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
58f0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
5900: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
5910: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
5920: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
5930: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
5940: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
5950: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
5960: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
5970: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
5980: 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69   is set to one i
5990: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
59a0: 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20   moved and 0 if 
59b0: 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
59c0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
59d0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
59e0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
59f0: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
5a00: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  ;..  rc = restor
5a10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5a20: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
5a30: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
5a40: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
5a50: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
5a60: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
5a70: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
5a80: 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20  ur->skip!=0 ){. 
5a90: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5aa0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
5ab0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a  *pHasMoved = 0;.
5ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5ad0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
5ae0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5af0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
5b00: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
5b10: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
5b20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
5b30: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
5b40: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
5b50: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
5b60: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
5b70: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
5b80: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
5b90: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
5ba0: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
5bb0: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
5bc0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
5bd0: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
5be0: 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69  apPage;.  Pgno i
5bf0: 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61  PtrMap, ret;.  a
5c00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5c10: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5c20: 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65  utex) );.  nPage
5c30: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
5c40: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
5c50: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
5c60: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
5c70: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
5c80: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
5c90: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
5ca0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
5cb0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
5cc0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
5cd0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
5ce0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
5cf0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
5d00: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
5d10: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
5d20: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
5d30: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
5d40: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
5d50: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
5d60: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
5d70: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
5d80: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
5d90: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
5da0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
5db0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
5dc0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5dd0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
5de0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
5df0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
5e00: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5e10: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
5e20: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
5e30: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
5e40: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
5e50: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
5e60: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
5e70: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
5e80: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
5e90: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
5ea0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
5eb0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
5ec0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
5ed0: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
5ee0: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
5ef0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
5f00: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
5f10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5f20: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5f30: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
5f40: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
5f50: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
5f60: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
5f70: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
5f80: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
5f90: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
5fa0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
5fb0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
5fc0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
5fd0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
5fe0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72   key==0 ){.    r
5ff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6000: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
6010: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6020: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6030: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6040: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6050: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6060: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6070: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
6090: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
60a0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
60b0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
60c0: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
60d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
60e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
60f0: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
6100: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74  _exit;.  }.  pPt
6110: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6120: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6130: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
6140: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
6150: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
6160: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6170: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
6180: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
6190: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
61a0: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
61b0: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
61c0: 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  t));.    rc = sq
61d0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
61e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
61f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6200: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
6210: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
6220: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
6230: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6240: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
6250: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
6260: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
6270: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6280: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
6290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
62a0: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
62b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
62c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
62d0: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
62e0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
62f0: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
6300: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6310: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
6320: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
6330: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
6340: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
6350: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
6360: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6370: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
6380: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
6390: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
63a0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
63b0: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
63c0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
63d0: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
63e0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
63f0: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
6400: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6410: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
6420: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6430: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
6440: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
6450: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
6460: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
6470: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
6480: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
6490: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
64a0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
64b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
64c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
64d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
64e0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
64f0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
6500: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
6510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
6520: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
6530: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
6540: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
6550: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6560: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
6570: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6580: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6590: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
65a0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
65b0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
65c0: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
65d0: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
65e0: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
65f0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
6600: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
6610: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
6620: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
6630: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
6640: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
6650: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
6660: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
6670: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6680: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
6690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
66a0: 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69  #else /* if defi
66b0: 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned SQLITE_OMIT_
66c0: 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20  AUTOVACUUM */.  
66d0: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
66e0: 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54  t(w,x,y,z) SQLIT
66f0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70  E_OK.  #define p
6700: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
6710: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
6720: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
6730: 76 66 6c 50 74 72 28 78 2c 20 79 29 20 53 51 4c  vflPtr(x, y) SQL
6740: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
6750: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
6760: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
6770: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
6780: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
6790: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
67a0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
67b0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
67c0: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
67d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
67e0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
67f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6800: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
6810: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
6820: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
6830: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6840: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
6850: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
6860: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
6870: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
6880: 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50  e(&(P)->aData[(P
6890: 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  )->cellOffset+2*
68a0: 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  (I)])))../*.** T
68b0: 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c  his a more compl
68c0: 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69  ex version of fi
68d0: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
68e0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
68f0: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
6900: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6910: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66  .*/.static u8 *f
6920: 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
6930: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6940: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e  int iCell){.  in
6950: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t i;.  assert( s
6960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6970: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6980: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  tex) );.  for(i=
6990: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
69a0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
69b0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
69c0: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
69d0: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
69e0: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
69f0: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
6a00: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
6a10: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
6a20: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
6a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6a40: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
6a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6a60: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
6a70: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
6a80: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
6a90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
6aa0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
6ab0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
6ac0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
6ad0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
6ae0: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
6af0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
6b00: 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50 61  nction.  btreePa
6b10: 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20  rseCell() takes 
6b20: 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78  a .** cell index
6b30: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
6b40: 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72 65  rgument and btre
6b50: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
6b60: 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  .** takes a poin
6b70: 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20  ter to the body 
6b80: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
6b90: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
6ba0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e  nt..**.** Within
6bb0: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20   this file, the 
6bc0: 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72  parseCell() macr
6bd0: 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  o can be called 
6be0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74  instead of.** bt
6bf0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6c00: 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f  ). Using some co
6c10: 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69  mpilers, this wi
6c20: 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f  ll be faster..*/
6c30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
6c40: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
6c50: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
6c60: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
6c70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
6c80: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
6c90: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
6ca0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
6cb0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
6cc0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
6cd0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
6ce0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
6cf0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
6d00: 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  16 n;           
6d10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6d20: 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63   bytes in cell c
6d30: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f  ontent header */
6d40: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
6d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6d60: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
6d70: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
6d80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6d90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6da0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6db0: 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70  ) );..  pInfo->p
6dc0: 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
6dd0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
6de0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
6df0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20  >leaf==1 );.  n 
6e00: 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  = pPage->childPt
6e10: 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  rSize;.  assert(
6e20: 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c   n==4-4*pPage->l
6e30: 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61  eaf );.  if( pPa
6e40: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
6e50: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
6e60: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20  Data ){.      n 
6e70: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
6e80: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
6e90: 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ad);.    }else{.
6ea0: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
6eb0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   0;.    }.    n 
6ec0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43  += getVarint(&pC
6ed0: 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70  ell[n], (u64*)&p
6ee0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20  Info->nKey);.   
6ef0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
6f00: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
6f10: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44  e{.    pInfo->nD
6f20: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b  ata = 0;.    n +
6f30: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
6f40: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
6f50: 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  d);.    pInfo->n
6f60: 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  Key = nPayload;.
6f70: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
6f80: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
6f90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
6fa0: 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61  er = n;.  testca
6fb0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
6fc0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
6fd0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
6fe0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
6ff0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
7000: 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61  ( likely(nPayloa
7010: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
7020: 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  al) ){.    /* Th
7030: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
7040: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
7050: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
7060: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
7070: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
7080: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
7090: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
70a0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
70b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
70c0: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
70d0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
70e0: 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a  ytes */.    nSiz
70f0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
7100: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
7110: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
7120: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
7130: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
7140: 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20     if( (nSize & 
7150: 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ~3)==0 ){.      
7160: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
7170: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
7180: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
7190: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
71a0: 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69  nSize = (u16)nSi
71b0: 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
71c0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
71d0: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
71e0: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
71f0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
7200: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20   have.    ** to 
7210: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
7220: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
7230: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
7240: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20   spill onto.    
7250: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
7260: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
7270: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
7280: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
7290: 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63  used.    ** spac
72a0: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
72b0: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
72c0: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
72d0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
72e0: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
72f0: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
7300: 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  Local..    **.  
7310: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
7320: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
7330: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
7340: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
7350: 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61  in any.    ** wa
7360: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
7370: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
7380: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
7390: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e    */.    int min
73a0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
73b0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
73c0: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
73d0: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78  y */.    int max
73e0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
73f0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
7400: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
7410: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72  y */.    int sur
7420: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
7430: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
7440: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
7450: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20  storage */..    
7460: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
7470: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
7480: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
7490: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
74a0: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
74b0: 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  al + (nPayload -
74c0: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
74d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
74e0: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
74f0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
7500: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
7510: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7520: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  s==maxLocal+1 );
7530: 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73  .    if( surplus
7540: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
7550: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
7560: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
7570: 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  us;.    }else{. 
7580: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
7590: 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63  al = (u16)minLoc
75a0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
75b0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
75c0: 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c   (u16)(pInfo->nL
75d0: 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70  ocal + n);.    p
75e0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
75f0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
7600: 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e   4;.  }.}.#defin
7610: 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67  e parseCell(pPag
7620: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7630: 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65 43   \.  btreeParseC
7640: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
7650: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
7660: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
7670: 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64  fo)).static void
7680: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
7690: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
76a0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
76b0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
76c0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
76d0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
76e0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
76f0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
7700: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
7710: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7720: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7730: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7740: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
7750: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
7760: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
7770: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
7780: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
7790: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
77a0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
77b0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
77c0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
77d0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
77e0: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
77f0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
7800: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
7810: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
7820: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
7830: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
7840: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
7850: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
7860: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
7870: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
7880: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
7890: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
78a0: 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d   = &pCell[pPage-
78b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
78c0: 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69    u32 nSize;..#i
78d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
78e0: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
78f0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7900: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7910: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
7920: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
7930: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
7940: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
7950: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
7960: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
7970: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
7980: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
7990: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
79a0: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
79b0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
79c0: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
79d0: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
79e0: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
79f0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
7a00: 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65  buginfo;.  btree
7a10: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
7a20: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
7a30: 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  ginfo);.#endif..
7a40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
7a50: 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  Key ){.    u8 *p
7a60: 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61  End;.    if( pPa
7a70: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
7a80: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
7a90: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
7aa0: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c   nSize);.    }el
7ab0: 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20  se{.      nSize 
7ac0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
7ad0: 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69  /* pIter now poi
7ae0: 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69  nts at the 64-bi
7af0: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61  t integer key va
7b00: 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20  lue, a variable 
7b10: 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69  length .    ** i
7b20: 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c  nteger. The foll
7b30: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65  owing block move
7b40: 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  s pIter to point
7b50: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79   at the first by
7b60: 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  te.    ** past t
7b70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65  he end of the ke
7b80: 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20  y value. */.    
7b90: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d  pEnd = &pIter[9]
7ba0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70  ;.    while( (*p
7bb0: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
7bc0: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
7bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
7be0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7bf0: 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20  pIter, nSize);. 
7c00: 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20   }..  testcase( 
7c10: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
7c20: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
7c30: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
7c40: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
7c50: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50  ;.  if( nSize>pP
7c60: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7c70: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
7c80: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7c90: 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  cal;.    nSize =
7ca0: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69   minLocal + (nSi
7cb0: 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25  ze - minLocal) %
7cc0: 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
7cd0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
7ce0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
7cf0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
7d00: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7d10: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7d20: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7d30: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  .    if( nSize>p
7d40: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7d50: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
7d60: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
7d70: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a      nSize += 4;.
7d80: 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28    }.  nSize += (
7d90: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
7da0: 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  ll);..  /* The m
7db0: 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  inimum size of a
7dc0: 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74  ny cell is 4 byt
7dd0: 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69  es. */.  if( nSi
7de0: 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a  ze<4 ){.    nSiz
7df0: 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73  e = 4;.  }..  as
7e00: 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62  sert( nSize==deb
7e10: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  uginfo.nSize );.
7e20: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
7e30: 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e  ize;.}.#ifndef N
7e40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36  DEBUG.static u16
7e50: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
7e60: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
7e70: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  ell){.  return c
7e80: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
7e90: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
7ea0: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
7eb0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
7ec0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7ed0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
7ee0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
7ef0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
7f00: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
7f10: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
7f20: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
7f30: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
7f40: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
7f50: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
7f60: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
7f70: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
7f80: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
7f90: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
7fa0: 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ll){.  CellInfo 
7fb0: 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20  info;.  assert( 
7fc0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74  pCell!=0 );.  bt
7fd0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7fe0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
7ff0: 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
8000: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
8010: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
8020: 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
8030: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28  Payload );.  if(
8040: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
8050: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
8060: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
8070: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
8080: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
8090: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
80a0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
80b0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
80c0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
80d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
80e0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  OK;.}.#endif.../
80f0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
8100: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
8110: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
8120: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
8130: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
8140: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
8150: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
8160: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8170: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8180: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8190: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
81a0: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
81b0: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
81c0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
81d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
81e0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
81f0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
8200: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
8220: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
8230: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
8240: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8250: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
8260: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8290: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
82a0: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
82d0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
82e0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
82f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
8300: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
8310: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
8320: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
8330: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8340: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
8350: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
8360: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8380: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8390: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
83a0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83c0: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
83d0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
83e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
83f0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
8400: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
8410: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8420: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
8430: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
8440: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
8450: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
8460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8470: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8480: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8490: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
84a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
84b0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
84c0: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
84d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
84e0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
84f0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8500: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8510: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
8520: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
8530: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
8540: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8550: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
8560: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8570: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8580: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8590: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
85a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
85b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
85c0: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
85d0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
85e0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
85f0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8600: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8610: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
8620: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
8630: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
8640: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
8650: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
8660: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8670: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8680: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8690: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
86a0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
86b0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
86c0: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
86d0: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
86e0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
86f0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8700: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
8710: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
8720: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
8730: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
8740: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
8750: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
8760: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8770: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8780: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8790: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
87a0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
87b0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
87c0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
87d0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
87e0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
87f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8800: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8810: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8830: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8840: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8850: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8860: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8870: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8880: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8890: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
88a0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
88b0: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
88c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
88d0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
88e0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
88f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8900: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8910: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8920: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8930: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8940: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8950: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8960: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8970: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8980: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
89a0: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
89b0: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
89c0: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
89d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
89e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
89f0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8a00: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8a10: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8a20: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8a30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8a40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8a50: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
8a60: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
8a70: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
8a80: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
8a90: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8aa0: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
8ab0: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8ac0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8ad0: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
8ae0: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
8af0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
8b00: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
8b10: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
8b20: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
8b30: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
8b40: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8b50: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
8b60: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
8b70: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
8b80: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
8b90: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
8ba0: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
8bb0: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
8bc0: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
8bd0: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
8be0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8bf0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8c00: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
8c10: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
8c20: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
8c30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8c40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8c50: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8c60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8c70: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
8c80: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
8c90: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
8ca0: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
8cb0: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
8cc0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8cd0: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
8ce0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
8cf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
8d00: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
8d10: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
8d20: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
8d30: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
8d40: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
8d50: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
8d60: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
8d70: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
8d80: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
8d90: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
8da0: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
8db0: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
8dc0: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
8dd0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
8de0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
8df0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
8e00: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
8e10: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
8e20: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
8e30: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
8e40: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
8e50: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
8e60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
8e70: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
8e80: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
8e90: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
8ea0: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
8eb0: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
8ec0: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
8ed0: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
8ee0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
8ef0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
8f00: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
8f10: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
8f20: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
8f30: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
8f40: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
8f50: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
8f60: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
8f70: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
8f80: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
8f90: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
8fa0: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
8fb0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
8fc0: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
8fd0: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9000: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
9010: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
9020: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9050: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
9060: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9070: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9080: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9090: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
90a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
90b0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
90c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
90d0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
90e0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 0a  turn code */.  .
90f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9100: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9110: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9120: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9130: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9140: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9150: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9160: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9170: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9180: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9190: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
91a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
91b0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
91c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
91d0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
91e0: 3d 30 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  =0 );..  nFrag =
91f0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
9200: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9210: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
9220: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
9230: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
9240: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9250: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
9260: 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  ell;.  top = get
9270: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9280: 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74  5]);.  if( gap>t
9290: 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  op ) return SQLI
92a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
92b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
92c0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
92d0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
92e0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
92f0: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20   gap==top );..  
9300: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b  if( nFrag>=60 ){
9310: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64  .    /* Always d
9320: 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79  efragment highly
9330: 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65   fragmented page
9340: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65  s */.    rc = de
9350: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
9360: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
9370: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
9380: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
9390: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
93a0: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
93b0: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
93c0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
93d0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
93e0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
93f0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
9400: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
9410: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
9420: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
9430: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
9440: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9450: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9460: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9470: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
9480: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9490: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
94a0: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
94b0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
94c0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
94d0: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
94e0: 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
94f0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
9500: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9510: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
9520: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
9530: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
9540: 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79  t x = size - nBy
9550: 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  te;.        test
9560: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
9570: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9580: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20  x==3 );.        
9590: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
95a0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
95b0: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
95c0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
95d0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
95e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  .          ** fr
95f0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
9600: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
9610: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
9620: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
9630: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
9640: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
9650: 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72  dr+7] = (u8)(nFr
9660: 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20  ag + x);.       
9670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9680: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
9690: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
96a0: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
96b0: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
96c0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
96d0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
96e0: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
96f0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
9700: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
9710: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
9720: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9730: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20       *pIdx = pc 
9740: 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74  + x;.        ret
9750: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9770: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
9780: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  make sure there 
9790: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
97a0: 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73 61  in the gap to sa
97b0: 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61  tisfy.  ** the a
97c0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e  llocation.  If n
97d0: 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a  ot, defragment..
97e0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
97f0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f   gap+2+nByte==to
9800: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
9810: 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20  +nByte>top ){.  
9820: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9830: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9840: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9850: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9860: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
9870: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
9880: 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74  rt( gap+nByte<=t
9890: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
98a0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
98b0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
98c0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
98d0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
98e0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
98f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
9900: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
9910: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
9920: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
9930: 70 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f  p);.  *pIdx = to
9940: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
9950: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9960: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
9970: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
9980: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
9990: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
99a0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
99b0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
99c0: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
99d0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
99e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
99f0: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
9a00: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
9a10: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
9a20: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
9a30: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
9a40: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
9a50: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
9a60: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
9a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
9a80: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
9a90: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
9aa0: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
9ab0: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
9ac0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
9ad0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
9ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
9af0: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
9b00: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
9b10: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9b20: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
9b30: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
9b40: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
9b50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
9b60: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
9b70: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
9b80: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
9b90: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
9ba0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
9bb0: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
9bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
9bd0: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
9be0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9bf0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
9c00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9c10: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9c20: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9c30: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
9c40: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
9c50: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
9c60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
9c70: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
9c80: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
9c90: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
9ca0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
9cb0: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
9cc0: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
9cd0: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
9ce0: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
9cf0: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
9d00: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
9d10: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
9d20: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
9d30: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
9d40: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   of freeblocks. 
9d50: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
9d60: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
9d70: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
9d80: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
9d90: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20  reeInitPage(),. 
9da0: 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
9db0: 65 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65  e() did not dete
9dc0: 63 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63  ct overlapping c
9dd0: 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65  ells or.  ** fre
9de0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65  eblocks that ove
9df0: 72 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20  rlapped cells.  
9e00: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74   Nor does it det
9e10: 65 63 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ect when the.  *
9e20: 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  * cell content a
9e30: 72 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20  rea exceeds the 
9e40: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67  value in the pag
9e50: 65 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68  e header.  If th
9e60: 65 73 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69  ese.  ** situati
9e70: 6f 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20  ons arise, then 
9e80: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72  subsequent inser
9e90: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67  t operations mig
9ea0: 68 74 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20  ht corrupt.  ** 
9eb0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53  the freelist.  S
9ec0: 6f 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20  o we do need to 
9ed0: 63 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70  check for corrup
9ee0: 74 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e  tion while scann
9ef0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65  ing.  ** the fre
9f00: 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64  elist..  */.  hd
9f10: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
9f20: 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68  fset;.  addr = h
9f30: 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20  dr + 1;.  iLast 
9f40: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
9f50: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
9f60: 61 73 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69  assert( start<=i
9f70: 4c 61 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28  Last );.  while(
9f80: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
9f90: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
9fa0: 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69  )<start && pbegi
9fb0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n>0 ){.    if( p
9fc0: 62 65 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a  begin<addr+4 ){.
9fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9fe0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
a000: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20   = pbegin;.  }. 
a010: 20 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73   if( pbegin>iLas
a020: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
a030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a040: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
a050: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
a060: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
a070: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a080: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
a090: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a0a0: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
a0b0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
a0c0: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
a0d0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
a0e0: 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  e = pPage->nFree
a0f0: 20 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20   + (u16)size;.. 
a100: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
a110: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
a120: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64  s */.  addr = hd
a130: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
a140: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
a150: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
a160: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
a170: 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20  ext, psize, x;. 
a180: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
a190: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73  n>addr );.    as
a1a0: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
a1b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a1c0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
a1d0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
a1e0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
a1f0: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
a200: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
a210: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
a220: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
a230: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
a240: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
a250: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
a260: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
a270: 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67  .      if( (frag
a280: 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e  <0) || (frag>(in
a290: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29  t)data[hdr+7]) )
a2a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
a2b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a2c0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
a2d0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
a2e0: 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20  -= (u8)frag;.   
a2f0: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
a300: 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20  &data[pnext]);. 
a310: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a320: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b  ata[pbegin], x);
a330: 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74  .      x = pnext
a340: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
a350: 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62  a[pnext+2]) - pb
a360: 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32  egin;.      put2
a370: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
a380: 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65  n+2], x);.    }e
a390: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20  lse{.      addr 
a3a0: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a  = pbegin;.    }.
a3b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a3c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a3d0: 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ea begins with a
a3e0: 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f   freeblock, remo
a3f0: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ve it. */.  if( 
a400: 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74  data[hdr+1]==dat
a410: 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61  a[hdr+5] && data
a420: 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+2]==data[hd
a430: 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  r+6] ){.    int 
a440: 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20  top;.    pbegin 
a450: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a460: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65  [hdr+1]);.    me
a470: 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31  mcpy(&data[hdr+1
a480: 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  ], &data[pbegin]
a490: 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  , 2);.    top = 
a4a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a4b0: 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74  dr+5]) + get2byt
a4c0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
a4d0: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
a4e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
a4f0: 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  op);.  }.  asser
a500: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a510: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a520: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
a550: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
a560: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
a570: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
a580: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
a590: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
a5a0: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
a5b0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
a5c0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
a5d0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
a5e0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
a5f0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
a600: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
a610: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
a620: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
a630: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
a640: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
a650: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
a660: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
a670: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
a680: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
a690: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
a6a0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
a6b0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
a6c0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
a6d0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
a6e0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
a6f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
a700: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
a710: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
a720: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
a730: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
a740: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a750: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
a760: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
a770: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a780: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
a790: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
a7a0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
a7b0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
a7c0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
a7d0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
a7e0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
a7f0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
a800: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a810: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
a820: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
a830: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
a840: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
a850: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
a860: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61  TKEY) ){.    pPa
a870: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
a880: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
a890: 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
a8a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
a8b0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
a8c0: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
a8d0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
a8e0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
a8f0: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
a900: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
a910: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
a920: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
a930: 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20  ->hasData = 0;. 
a940: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
a950: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
a960: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
a970: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
a980: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
a990: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a9a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a9b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
a9c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a9d0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
a9e0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
a9f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
aa00: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
aa10: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
aa20: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
aa30: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
aa40: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
aa50: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
aa60: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
aa70: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
aa80: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
aa90: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
aaa0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
aab0: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
aac0: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
aad0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
aae0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
aaf0: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
ab00: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
ab10: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
ab20: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
ab30: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
ab40: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ab50: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
ab60: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ab70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ab80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ab90: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
aba0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
abb0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
abc0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
abd0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
abe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
abf0: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
ac00: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ac10: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ac20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ac30: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
ac40: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ac50: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
ac60: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
ac70: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
ac80: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
ac90: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
aca0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
acb0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
acc0: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
acd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ace0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
acf0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
ad00: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
ad10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
ad20: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
ad30: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
ad40: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
ad50: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
ad60: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
ad70: 20 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a     u16 usableSiz
ad80: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
ad90: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
ada0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
adb0: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
adc0: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
add0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
ade0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
adf0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
ae00: 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20   u16 nFree;     
ae10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ae20: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ae30: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
ae40: 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20   u16 top;       
ae50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ae60: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ae70: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ae80: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ae90: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
aea0: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
aeb0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
aec0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
aed0: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
aee0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
aef0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
af00: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
af10: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
af20: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
af30: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
af40: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
af50: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
af60: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
af70: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
af80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
af90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
afa0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
afb0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
afc0: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
afd0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
afe0: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
aff0: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20  geSize - 1;.    
b000: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b010: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
b020: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
b030: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
b040: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
b050: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
b060: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
b070: 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d  >leaf;.    top =
b080: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b090: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
b0a0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
b0b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
b0c0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
b0d0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
b0e0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
b0f0: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
b100: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
b110: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
b120: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
b130: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b140: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
b160: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
b170: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
b180: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
b190: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
b1a0: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
b1b0: 65 20 75 73 65 20 74 6f 20 72 65 61 64 20 70 61  e use to read pa
b1c0: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
b1d0: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
b1e0: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
b1f0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
b200: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
b210: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
b220: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
b230: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
b240: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
b250: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
b260: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
b270: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
b280: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
b290: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
b2a0: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
b2b0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
b2c0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
b2d0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
b2e0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
b2f0: 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65  Size - 4;.#if de
b300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b310: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
b320: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20  L_CHECK).    {. 
b330: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
b340: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
b350: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
b360: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
b370: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
b380: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b390: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
b3a0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
b3b0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
b3c0: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
b3d0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
b3e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b3f0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
b400: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
b410: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
b420: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
b430: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
b440: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b450: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
b460: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
b470: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
b480: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
b490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b4a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b4b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b4c0: 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
b4d0: 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
b4e0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
b4f0: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
b500: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b510: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
b520: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b530: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b540: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b550: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
b560: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
b570: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
b580: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
b590: 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f    .#endif..    /
b5a0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
b5b0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
b5c0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
b5d0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
b5e0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
b5f0: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
b600: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20  hdr+7] + top;.  
b610: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
b620: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
b630: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
b640: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
b650: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
b660: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
b670: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
b680: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
b690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b6a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
b6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
b6c0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
b6d0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
b6e0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
b6f0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
b700: 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26      if( next>0 &
b710: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
b720: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  3 ){.        /* 
b730: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
b740: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
b750: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
b760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b770: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
b780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
b790: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
b7a0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
b7b0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
b7c0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
b7d0: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
b7e0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
b7f0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
b800: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
b810: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
b820: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
b830: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
b840: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
b850: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
b860: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
b870: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
b880: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
b890: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
b8a0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
b8b0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
b8c0: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
b8d0: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
b8e0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
b8f0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
b900: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
b910: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
b920: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
b930: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
b940: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
b950: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
b960: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
b970: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
b980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b990: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b9a0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
b9b0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65  ge->nFree = nFre
b9c0: 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 3b 0a  e - iCellFirst;.
b9d0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
b9e0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
b9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ba00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
ba10: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
ba20: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
ba30: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
ba40: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
ba50: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
ba60: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
ba70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ba80: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
ba90: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
baa0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
bab0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
bac0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
bad0: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
bae0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
baf0: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
bb00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
bb10: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
bb20: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
bb30: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
bb40: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
bb50: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
bb60: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
bb70: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
bb80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bb90: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
bba0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
bbb0: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
bbc0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
bbd0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
bbe0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
bbf0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bc00: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
bc10: 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65  ex) );.  /*memse
bc20: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
bc30: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
bc40: 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74   - hdr);*/.  dat
bc50: 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
bc60: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
bc70: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
bc80: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
bc90: 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74   ?1:0);.  memset
bca0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
bcb0: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
bcc0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
bcd0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
bce0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
bcf0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
bd00: 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee = pBt->usable
bd10: 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20  Size - first;.  
bd20: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
bd30: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
bd40: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
bd50: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
bd60: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
bd70: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
bd80: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
bd90: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
bda0: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
bdb0: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
bdc0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
bdd0: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
bde0: 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65  ize - 1;.  pPage
bdf0: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
be00: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
be10: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
be20: 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
be30: 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
be40: 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
be50: 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
be60: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
be70: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
be80: 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
be90: 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
bea0: 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
beb0: 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
bec0: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
bed0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
bee0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
bef0: 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
bf00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
bf10: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
bf20: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
bf30: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
bf40: 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
bf50: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
bf60: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
bf70: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
bf80: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
bf90: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
bfa0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
bfb0: 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
bfc0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
bfd0: 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
bfe0: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
bff0: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
c000: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
c010: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  s if needed..**.
c020: 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74  ** If the noCont
c030: 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ent flag is set,
c040: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
c050: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
c060: 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
c070: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
c080: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
c090: 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
c0a0: 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
c0b0: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
c0c0: 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
c0d0: 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
c0e0: 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
c0f0: 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
c100: 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
c110: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
c120: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
c130: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
c140: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
c150: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
c160: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
c170: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
c180: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
c190: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
c1a0: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
c1b0: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
c1c0: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
c1d0: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
c1e0: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
c1f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c200: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
c210: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
c220: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
c230: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
c240: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
c250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
c260: 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ent        /* Do
c270: 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63   not load page c
c280: 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a  ontent if true *
c290: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
c2a0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
c2b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c2c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c2d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c2e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c2f0: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
c300: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
c310: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
c320: 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69   noContent);.  i
c330: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c340: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
c350: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
c360: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
c370: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
c380: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c390: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
c3a0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
c3b0: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
c3c0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
c3d0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
c3e0: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
c3f0: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
c400: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
c410: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
c420: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
c430: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
c440: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
c450: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c460: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
c470: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
c480: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
c490: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
c4a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c4b0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
c4c0: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
c4d0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
c4e0: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
c4f0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
c500: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
c510: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
c520: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
c530: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
c540: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c550: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c560: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
c570: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
c580: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
c590: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
c5a0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
c5b0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
c5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
c5d0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42  pagerPagecount(B
c5e0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
c5f0: 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b   int nPage = -1;
c600: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
c610: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
c620: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
c630: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
c640: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
c650: 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
c660: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
c670: 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20  | nPage==-1 );. 
c680: 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50   return (Pgno)nP
c690: 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  age;.}../*.** Ge
c6a0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c6b0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
c6c0: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
c6d0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
c6e0: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
c6f0: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
c700: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
c710: 74 6f 0a 2a 2a 20 62 74 72 65 65 47 65 74 50 61  to.** btreeGetPa
c720: 67 65 28 29 20 61 6e 64 20 62 74 72 65 65 49 6e  ge() and btreeIn
c730: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
c740: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
c750: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
c760: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
c770: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
c780: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
c790: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
c7a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
c7b0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
c7c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
c7d0: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
c7e0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
c7f0: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
c800: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
c810: 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
c820: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c830: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c840: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
c850: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c860: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c870: 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f  _BKPT; .  }..  /
c880: 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68  * It is often th
c890: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
c8a0: 70 61 67 65 20 77 65 20 77 61 6e 74 20 69 73 20  page we want is 
c8b0: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
c8c0: 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65  ..  ** If so, ge
c8d0: 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20  t it directly.  
c8e0: 54 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72  This saves us fr
c8f0: 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c  om having to cal
c900: 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65  l.  ** pagerPage
c910: 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20  count() to make 
c920: 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74  sure pgno is wit
c930: 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63  hin limits, whic
c940: 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69  h results.  ** i
c950: 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  n a measureable 
c960: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
c970: 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  ovements..  */. 
c980: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
c990: 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
c9a0: 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20  up(pBt, pgno);. 
c9b0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
c9c0: 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72    /* Page is alr
c9d0: 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f  eady in cache */
c9e0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c9f0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
ca00: 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e    /* Page not in
ca10: 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65   cache.  Acquire
ca20: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 74 65 73 74   it. */.    test
ca30: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 70 61 67 65  case( pgno==page
ca40: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
ca50: 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
ca60: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
ca70: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Bt) ){.      ret
ca80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ca90: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
caa0: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
cab0: 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
cac0: 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
cad0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cae0: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20 3d   rc;.    pPage =
caf0: 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20   *ppPage;.  }.  
cb00: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
cb10: 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  it ){.    rc = b
cb20: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
cb30: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
cb40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cb50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
cb60: 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50  pPage);.    *ppP
cb70: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
cb80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cb90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
cba0: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
cbb0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
cbc0: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
cbd0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
cbe0: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
cbf0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
cc00: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
cc10: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
cc20: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
cc30: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cc40: 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  w==0 || sqlite3P
cc50: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
cc60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cc70: 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >1 );.    assert
cc80: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
cc90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
cca0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
ccb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
ccc0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
ccd0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
cce0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
ccf0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
cd00: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
cd10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
cd20: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
cd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
cd40: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cd50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
cd60: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
cd70: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
cd80: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
cd90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  .}../*.** During
cda0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
cdb0: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
cdc0: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
cdd0: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
cde0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
cdf0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
ce00: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
ce10: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
ce20: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
ce30: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
ce40: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
ce50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ce60: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
ce70: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
ce80: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
ce90: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
cea0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
ceb0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
cec0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
ced0: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
cee0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
cef0: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
cf00: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
cf10: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
cf20: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
cf30: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
cf40: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
cf50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
cf60: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
cf70: 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20  ata)>0 );.  if( 
cf80: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
cf90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
cfa0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cfb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
cfc0: 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
cfd0: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
cfe0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
cff0: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
d000: 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  ata)>1 ){.      
d010: 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e  /* pPage might n
d020: 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61  ot be a btree pa
d030: 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65  ge;  it might be
d040: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
d050: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74  e.      ** or pt
d060: 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66  rmap page or a f
d070: 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68  ree page.  In th
d080: 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66  ose cases, the f
d090: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
d0a0: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49  * call to btreeI
d0b0: 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
d0c0: 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
d0d0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
d0e0: 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
d0f0: 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
d100: 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
d110: 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
d120: 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65  t.      ** btree
d130: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
d140: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
d150: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
d160: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
d170: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
d180: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
d190: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
d1a0: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65  g. */.      btre
d1b0: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
d1c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
d1d0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
d1e0: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
d1f0: 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
d200: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76  tic int btreeInv
d210: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76  okeBusyHandler(v
d220: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74  oid *pArg){.  Bt
d230: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42  Shared *pBt = (B
d240: 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20  tShared*)pArg;. 
d250: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62   assert( pBt->db
d260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d270: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d280: 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
d290: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
d2a0: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
d2b0: 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e  ndler(&pBt->db->
d2c0: 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a  busyHandler);.}.
d2d0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
d2e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
d2f0: 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
d300: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d310: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d320: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
d330: 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64   NULL.** a new d
d340: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72  atabase with a r
d350: 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72  andom name is cr
d360: 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e  eated.  This ran
d370: 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64  domly named.** d
d380: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
d390: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
d3a0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
d3b0: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
d3c0: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
d3d0: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
d3e0: 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
d3f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
d400: 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
d410: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
d420: 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
d430: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
d440: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
d450: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
d460: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
d470: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d480: 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
d490: 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
d4a0: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
d4b0: 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
d4c0: 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
d4d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
d4e0: 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
d4f0: 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
d500: 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
d510: 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
d520: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d530: 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
d540: 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
d550: 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
d560: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
d570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
d580: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
d590: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
d5a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
d5b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d5c0: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
d5d0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d5f0: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
d600: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
d610: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
d620: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
d630: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
d640: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
d650: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
d660: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
d670: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
d680: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
d690: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
d6a0: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
d6b0: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
d6c0: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
d6d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d6f0: 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   The VFS to use 
d700: 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a  for this btree *
d710: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
d720: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
d730: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
d740: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
d750: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
d760: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
d770: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
d780: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
d790: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
d7a0: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
d7b0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
d7c0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
d7d0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
d7e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d7f0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
d800: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
d810: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
d820: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
d830: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
d840: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
d850: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
d860: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
d870: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
d880: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
d890: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
d8a0: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
d8b0: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
d8c0: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
d8d0: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
d8e0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
d8f0: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
d900: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
d910: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
d920: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
d930: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
d940: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
d950: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
d960: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
d970: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
d980: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
d990: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
d9a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d9b0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
d9c0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
d9d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d9e0: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
d9f0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
da00: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
da10: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
da20: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
da30: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
da40: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
da50: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
da60: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
da70: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
da80: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
da90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
daa0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
dab0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
dac0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
dad0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
dae0: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
daf0: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
db00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
db10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
db20: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
db30: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
db40: 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
db50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
db60: 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
db70: 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
db80: 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
db90: 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
dba0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dbb0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
dbc0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
dbd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
dbe0: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
dbf0: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
dc00: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
dc10: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
dc20: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
dc30: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
dc40: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
dc50: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
dc60: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
dc70: 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61  db==0 && zFilena
dc80: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
dc90: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  0] ){.    if( sq
dca0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
dcb0: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
dcc0: 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  bled ){.      in
dcd0: 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
dce0: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
dcf0: 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
dd00: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
dd10: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
dd20: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
dd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
dd40: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
dd50: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ;.      p->shara
dd60: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  ble = 1;.      d
dd70: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
dd80: 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a  TE_SharedCache;.
dd90: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
dda0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
ddb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ddc0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
ddd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
dde0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ddf0: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
de00: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
de10: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
de20: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
de30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
de40: 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
de50: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
de60: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
de70: 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
de80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
de90: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
dea0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
deb0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
dec0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
ded0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
dee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
def0: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
df00: 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  red);.      for(
df10: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
df20: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
df30: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
df40: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
df50: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
df60: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
df70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
df80: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
df90: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
dfa0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
dfb0: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
dfd0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
dfe0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
dff0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
e000: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
e010: 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
e020: 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
e030: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
e040: 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
e050: 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
e060: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
e070: 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
e080: 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
e090: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
e0a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e0b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
e0c0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
e0d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e0e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
e0f0: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
e100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
e110: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
e120: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e130: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
e140: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e150: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e160: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
e170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e180: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
e190: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
e1a0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
e1b0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
e1c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
e1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e1e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e1f0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
e200: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e210: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e220: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
e230: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
e240: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
e250: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
e260: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
e270: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
e280: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
e290: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
e2a0: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
e2b0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
e2c0: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
e2d0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
e2e0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
e2f0: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
e300: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
e310: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
e320: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
e330: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
e340: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
e350: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
e360: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
e370: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
e380: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
e390: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
e3a0: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
e3b0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
e3c0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
e3d0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
e3e0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
e3f0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
e400: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
e410: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
e420: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
e430: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
e440: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
e450: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
e460: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e470: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
e480: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
e490: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e4a0: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
e4b0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
e4c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e4d0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
e4e0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
e4f0: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
e500: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
e510: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
e520: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
e530: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
e540: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
e550: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
e560: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e570: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
e580: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
e590: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
e5a0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e5b0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
e5c0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
e5f0: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
e600: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
e610: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e620: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e630: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
e640: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
e650: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
e660: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
e670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e680: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e690: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
e6a0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
e6b0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
e6c0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
e6d0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
e6e0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
e6f0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
e700: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
e710: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
e720: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
e730: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
e740: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
e750: 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d  einit);.    pBt-
e760: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
e770: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e780: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
e790: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
e7a0: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
e7b0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
e7c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
e7d0: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
e7e0: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
e7f0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
e800: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
e810: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
e820: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
e830: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
e840: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
e850: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
e860: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
e870: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
e880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e890: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
e8a0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
e8b0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
e8c0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
e8d0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
e8e0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
e8f0: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
e900: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
e910: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
e920: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
e930: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
e940: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
e950: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
e960: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
e970: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
e980: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
e990: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
e9a0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
e9b0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
e9c0: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
e9d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
e9e0: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
e9f0: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
ea00: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
ea10: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
ea20: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
ea30: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
ea40: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
ea50: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
ea60: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
ea70: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
ea80: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
ea90: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
eaa0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
eab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
eac0: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
ead0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
eae0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
eaf0: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
eb00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
eb10: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
eb20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eb30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
eb40: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
eb50: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
eb60: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
eb70: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
eb80: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
eb90: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
eba0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
ebb0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
ebc0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ebd0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
ebe0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
ebf0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
ec00: 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
ec10: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
ec20: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
ec30: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
ec40: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
ec50: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
ec60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
ec70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
ec80: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
ec90: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
eca0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
ecb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
ecc0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ecd0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
ece0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
ecf0: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
ed00: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
ed10: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
ed20: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
ed30: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
ed40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ed50: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
ed60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ed70: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
ed80: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
ed90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65   = 1;.      mute
eda0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
edb0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
edc0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
edd0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69  MASTER);.      i
ede0: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
edf0: 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
ee00: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
ee10: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
ee20: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
ee30: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
ee40: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
ee50: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
ee60: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
ee70: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
ee80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ee90: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
eea0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
eeb0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
eec0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
eed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
eef0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
ef00: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
ef10: 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
ef20: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
ef30: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
ef40: 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
ef50: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
ef60: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
ef70: 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
ef80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ef90: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
efa0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
efb0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
efc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
efd0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
efe0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eff0: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
f000: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
f010: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
f020: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
f030: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
f040: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
f050: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
f060: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
f070: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
f080: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
f090: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
f0a0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
f0b0: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
f0c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
f0d0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
f0e0: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
f0f0: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
f100: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
f110: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
f120: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
f130: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
f140: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
f150: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
f160: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
f170: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
f180: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
f190: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
f1a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
f1b0: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
f1c0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
f1d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f1e0: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
f1f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f200: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
f210: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
f220: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
f230: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
f240: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
f250: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
f260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f270: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
f280: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
f290: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
f2a0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
f2b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
f2c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
f2d0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
f2e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f2f0: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
f300: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
f310: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f330: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
f340: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
f350: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
f360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f370: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
f380: 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
f390: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f3a0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
f3b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
f3c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
f3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f3e0: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
f3f0: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ee = 0;.  }.  if
f400: 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
f410: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f420: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
f430: 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
f440: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f450: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
f460: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
f480: 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
f490: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
f4a0: 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
f4b0: 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
f4c0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
f4d0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
f4e0: 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
f4f0: 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
f500: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
f510: 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
f520: 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
f530: 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
f540: 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
f550: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
f560: 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
f570: 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
f580: 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
f590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
f5a0: 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69  RED_CACHE.  sqli
f5b0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
f5c0: 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  er;.  BtShared *
f5d0: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
f5e0: 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
f5f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f600: 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
f610: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73  mutex) );.  pMas
f620: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
f630: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f640: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
f650: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
f660: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
f670: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
f680: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
f690: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
f6a0: 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
f6b0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
f6c0: 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
f6d0: 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
f6e0: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
f6f0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
f700: 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
f710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f720: 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
f730: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
f740: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
f750: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
f760: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
f770: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
f780: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
f790: 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
f7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f7b0: 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
f7c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
f7d0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
f7e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
f7f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
f800: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
f810: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f820: 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
f830: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
f840: 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
f850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
f860: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
f870: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
f880: 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
f890: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
f8b0: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
f8c0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
f8d0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
f8e0: 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
f8f0: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
f900: 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
f910: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
f920: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
f930: 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
f940: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
f950: 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
f960: 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
f970: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  pageSize );.  }.
f980: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
f990: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
f9a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
f9b0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
f9c0: 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
f9d0: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
f9e0: 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d  e3PageFree( pBt-
f9f0: 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70  >pTmpSpace);.  p
fa00: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
fa10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
fa20: 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
fa30: 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
fa40: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
fa50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
fa60: 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
fa70: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
fa80: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
fa90: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
faa0: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
fab0: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
fac0: 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
fad0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
fae0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
faf0: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
fb00: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
fb10: 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
fb20: 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
fb30: 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
fb40: 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
fb50: 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
fb60: 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
fb70: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
fb80: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
fb90: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fba0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
fbb0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
fbc0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
fbd0: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
fbe0: 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
fbf0: 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
fc00: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
fc10: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
fc20: 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
fc30: 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
fc40: 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
fc50: 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
fc60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
fc70: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c  llback(p);.  sql
fc80: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
fc90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
fca0: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
fcb0: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
fcc0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
fcd0: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
fce0: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
fcf0: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
fd00: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
fd10: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
fd20: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
fd30: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
fd40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
fd50: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
fd60: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
fd70: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
fd80: 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
fd90: 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
fda0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
fdb0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
fdc0: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
fdd0: 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
fde0: 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
fdf0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
fe00: 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
fe10: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
fe20: 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
fe30: 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
fe40: 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
fe50: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
fe60: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
fe70: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
fe80: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
fe90: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
fea0: 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
feb0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
fec0: 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
fed0: 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
fee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fef0: 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53  te3_free(pBt->pS
ff00: 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
ff10: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
ff20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff30: 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
ff40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ff50: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
ff60: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
ff70: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
ff80: 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
ff90: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
ffa0: 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
ffb0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
ffc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
ffd0: 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
ffe0: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
fff0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
10000 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
10010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10020 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10030 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
10040 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
10050 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
10060 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
10070 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
10080 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
10090 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
100a0 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
100b0 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
100c0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
100d0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
100e0 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
100f0 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
10100 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
10110 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
10120 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
10130 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
10140 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
10150 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
10160 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
10170 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
10180 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
10190 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
101a0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
101b0 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
101c0 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
101d0 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
101e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
101f0 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
10200 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
10210 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
10220 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
10230 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
10240 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
10250 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
10260 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
10270 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
10280 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
10290 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
102a0 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
102b0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
102c0 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
102d0 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
102e0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
102f0 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
10300 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
10310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10320 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
10330 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10340 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
10350 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
10360 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10370 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10380 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
10390 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
103a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
103b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
103c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
103d0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
103e0 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
103f0 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
10400 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
10410 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
10420 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
10430 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
10440 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
10450 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
10460 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
10470 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
10480 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
10490 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
104a0 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
104b0 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
104c0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
104d0 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
104e0 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
104f0 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
10500 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
10510 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10520 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
10530 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
10540 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
10550 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
10560 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
10570 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
10580 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
10590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
105a0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
105b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
105c0 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
105d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
105e0 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
105f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
10600 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
10610 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10620 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10630 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10640 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10650 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10660 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
10670 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
10680 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  l, fullSync);.  
10690 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
106a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
106b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
106c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
106d0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
106e0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
106f0 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
10700 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
10710 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
10720 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
10730 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
10740 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
10750 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
10760 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
10770 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
10780 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10790 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
107a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
107b0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
107c0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
107d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
107e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
107f0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
10800 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
10810 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
10820 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
10830 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10850 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10860 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
10870 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
10880 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10890 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
108a0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
108b0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
108c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
108d0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
108e0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
108f0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
10900 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10910 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
10920 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
10930 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
10940 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
10950 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
10960 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
10970 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
10980 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
10990 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
109a0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
109b0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
109c0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
109d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
109e0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
109f0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
10a00 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
10a10 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
10a20 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
10a30 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
10a40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10a50 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
10a60 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
10a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
10a80 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
10a90 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
10aa0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
10ab0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
10ac0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
10ad0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
10ae0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
10af0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
10b00 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
10b10 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
10b20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
10b30 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
10b40 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
10b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
10b60 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
10b70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
10b80 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
10b90 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
10ba0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
10bb0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
10bc0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
10bd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10be0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
10bf0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
10c00 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
10c10 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
10c20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10c30 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
10c40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10c50 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
10c60 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
10c70 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
10c80 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10c90 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
10ca0 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
10cb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
10cc0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
10cd0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
10ce0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
10cf0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
10d00 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
10d10 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
10d20 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
10d30 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
10d40 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
10d50 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
10d60 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
10d70 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
10d80 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
10d90 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
10da0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
10db0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
10dc0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
10dd0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
10de0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
10df0 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
10e00 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
10e10 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
10e20 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
10e30 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10e40 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
10e50 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10e60 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
10e70 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
10e80 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
10e90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10ea0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
10eb0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
10ec0 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
10ed0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10ee0 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
10ef0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
10f00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10f10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
10f20 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
10f30 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
10f40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
10f50 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
10f60 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
10f70 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
10f80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10f90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
10fa0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
10fb0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
10fc0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
10fd0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
10fe0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
10ff0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11000 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11010 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11020 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11040 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11050 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11060 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11070 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11080 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11090 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
110a0 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
110b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
110c0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
110d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
110e0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
110f0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11100 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11110 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11120 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11130 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11140 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11150 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11160 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
11170 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
11180 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11190 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
111a0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
111b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
111c0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
111d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
111e0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
111f0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11200 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
11210 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
11220 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11230 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11240 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
11250 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11260 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
11270 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
11280 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
11290 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
112a0 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
112b0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
112c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
112d0 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
112e0 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
112f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
11300 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
11310 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
11320 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
11330 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
11340 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
11350 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
11360 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
11370 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
11380 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
11390 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
113a0 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
113b0 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
113c0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
113d0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
113e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
113f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
11410 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
11420 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11430 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
11440 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11450 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
11460 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
11470 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11480 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
11490 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61  eSizeFixed && (a
114a0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
114b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
114c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
114d0 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
114e0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
114f0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
11500 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
11510 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
11520 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
11530 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11540 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
11550 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11560 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
11570 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
11580 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
11590 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
115a0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
115b0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
115c0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
115d0 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
115e0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
115f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11600 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
11610 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
11620 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
11630 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
11640 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11650 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
11660 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
11670 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
11680 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
11690 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
116a0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
116b0 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
116c0 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
116d0 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
116e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
116f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11700 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
11710 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
11720 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
11730 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11740 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
11750 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
11760 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
11770 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
11780 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11790 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
117a0 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
117b0 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
117c0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
117d0 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
117e0 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
117f0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
11800 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
11810 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
11820 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
11830 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
11840 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
11850 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
11860 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
11870 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
11880 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
11890 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
118a0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50  pPage1;.  int nP
118b0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
118c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
118d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
118e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
118f0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
11900 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
11910 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
11920 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
11930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
11940 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
11950 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
11960 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
11970 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
11980 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
11990 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
119a0 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
119b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
119c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
119d0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
119e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
119f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
11a00 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
11a10 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  d;.  }else if( n
11a20 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Page>0 ){.    in
11a30 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
11a40 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
11a50 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
11a60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
11a70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11a80 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d  OTADB;.    if( m
11a90 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
11aa0 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
11ab0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
11ac0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
11ad0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
11ae0 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
11af0 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f        pBt->readO
11b00 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nly = 1;.    }. 
11b10 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
11b20 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
11b30 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
11b40 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
11b50 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
11b60 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
11b70 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
11b80 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
11b90 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
11ba0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
11bb0 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
11bc0 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
11bd0 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
11be0 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
11bf0 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
11c00 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
11c10 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
11c20 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
11c30 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
11c40 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
11c50 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
11c60 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
11c70 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
11c80 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
11c90 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
11ca0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
11cc0 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
11cd0 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
11ce0 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
11cf0 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
11d00 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20  || pageSize<512 
11d10 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49  ||.        (SQLI
11d20 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
11d30 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69  <32768 && pageSi
11d40 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
11d50 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a  GE_SIZE).    ){.
11d60 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
11d70 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11d80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
11d90 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
11da0 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
11db0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
11dc0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
11dd0 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42  if( pageSize!=pB
11de0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
11df0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
11e00 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
11e10 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
11e20 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
11e30 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
11e40 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
11e50 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
11e60 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
11e70 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
11e80 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
11e90 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
11ea0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
11eb0 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
11ec0 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
11ed0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
11ee0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
11ef0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
11f00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
11f10 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
11f20 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
11f30 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
11f40 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
11f50 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
11f60 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
11f70 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
11f80 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
11f90 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
11fa0 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
11fb0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
11fc0 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
11fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11fe0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11ff0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
12000 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
12030 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
12040 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12050 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
12060 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a  ableSize<480 ){.
12070 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
12080 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
12090 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
120a0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
120b0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
120c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31  usableSize = (u1
120d0 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  6)usableSize;.#i
120e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
120f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
12100 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
12110 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
12120 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
12130 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
12140 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
12150 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
12160 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
12170 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
12180 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
12190 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
121a0 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
121b0 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
121c0 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
121d0 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
121e0 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
121f0 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
12200 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
12210 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
12220 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
12230 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
12240 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
12250 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
12260 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
12270 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
12280 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
12290 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
122a0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
122b0 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
122c0 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
122d0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
122e0 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
122f0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
12300 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
12310 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
12320 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
12330 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
12340 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
12350 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
12360 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
12370 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
12380 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
12390 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
123a0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
123b0 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
123c0 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
123d0 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
123e0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
123f0 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
12400 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
12410 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12420 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
12430 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70  pBt->maxLeaf = p
12440 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
12450 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   35;.  pBt->minL
12460 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  eaf = (pBt->usab
12470 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
12480 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74  5 - 23;.  assert
12490 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
124a0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
124b0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
124c0 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
124d0 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
124e0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
124f0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
12500 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
12510 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
12520 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
12530 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
12540 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
12550 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
12560 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
12570 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
12580 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
12590 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
125a0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
125b0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
125c0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
125d0 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
125e0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
125f0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
12600 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
12610 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
12620 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
12630 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
12640 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
12650 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
12660 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12670 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
12680 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
12690 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
126a0 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
126b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
126c0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
126d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
126e0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c  Bt->pCursor==0 |
126f0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
12700 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
12710 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
12720 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
12730 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
12740 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
12750 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
12760 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
12770 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12780 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
12790 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
127a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
127b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
127c0 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
127d0 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
127e0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
127f0 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
12800 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12810 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  w database by in
12820 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
12830 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
12840 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
12850 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
12860 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
12870 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
12880 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
12890 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
128a0 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
128b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
128c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
128d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
128e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
128f0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
12900 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
12910 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12920 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30  TE_OK || nPage>0
12930 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
12940 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
12950 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
12960 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
12970 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
12980 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
12990 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
129a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
129b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
129c0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
129d0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
129e0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
129f0 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
12a00 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
12a10 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
12a20 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
12a30 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
12a40 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
12a50 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
12a60 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
12a70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
12a80 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
12a90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
12aa0 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
12ab0 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
12ac0 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
12ad0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
12ae0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
12af0 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
12b00 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
12b10 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
12b20 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
12b30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
12b40 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
12b50 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
12b60 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
12b70 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12b80 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
12b90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12ba0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
12bb0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
12bc0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
12bd0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
12be0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
12bf0 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
12c00 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
12c10 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
12c20 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
12c30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12c40 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
12c50 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
12c60 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
12c70 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
12c80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12c90 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
12ca0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
12cb0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
12cc0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
12cd0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
12ce0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12cf0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
12d00 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
12d10 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
12d20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
12d30 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
12d40 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
12d50 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
12d60 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
12d70 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
12d80 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
12d90 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
12da0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
12db0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
12dc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
12dd0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
12de0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
12df0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
12e00 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
12e10 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
12e20 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
12e30 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
12e40 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
12e50 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
12e60 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
12e70 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
12e80 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
12e90 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
12ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
12eb0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
12ec0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
12ed0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
12ee0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
12ef0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
12f00 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
12f10 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
12f20 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
12f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
12f40 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
12f50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
12f60 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
12f70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12f80 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
12f90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12fa0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
12fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
12fc0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
12fd0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
12fe0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
12ff0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
13000 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
13010 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
13020 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
13030 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
13040 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
13050 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
13060 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
13070 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
13080 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
13090 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
130a0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
130b0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
130c0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
130d0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
130e0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
130f0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
13100 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
13110 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
13120 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
13130 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
13140 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
13150 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
13160 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
13170 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
13180 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
13190 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
131a0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
131b0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
131c0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
131d0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
131e0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
131f0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
13200 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
13210 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
13220 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
13230 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
13240 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
13250 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
13260 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
13270 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
13280 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
13290 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
132a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
132b0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
132c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
132d0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
132e0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
132f0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
13300 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
13310 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
13320 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13330 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
13340 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
13350 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
13360 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
13370 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13380 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
13390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
133a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
133b0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
133c0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
133d0 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
133e0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
133f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13400 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
13410 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
13420 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
13430 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
13440 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
13450 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
13460 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
13470 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
13480 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
13490 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
134a0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
134b0 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
134c0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
134d0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
134e0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
134f0 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
13500 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
13510 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
13520 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
13530 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
13540 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
13550 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
13560 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
13570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13580 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
13590 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
135a0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
135b0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
135c0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
135d0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
135e0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
135f0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
13600 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
13610 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
13620 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
13630 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
13640 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
13650 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
13660 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
13670 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
13680 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20  isPending ){.   
13690 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
136a0 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
136b0 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
136c0 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
136d0 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
136e0 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
136f0 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
13700 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
13710 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
13720 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
13730 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
13740 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
13750 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13770 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
13780 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
13790 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
137a0 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
137b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
137c0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
137d0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
137e0 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
137f0 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
13800 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
13810 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13820 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
13830 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
13840 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
13850 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
13860 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
13870 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
13880 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
13890 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
138a0 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
138b0 65 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 53  ened. */.  if( S
138c0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
138d0 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
138e0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
138f0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
13900 4f 43 4b 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  OCK)) ){.    got
13910 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
13920 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f   }..  do {.    /
13930 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
13940 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
13950 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
13960 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
13970 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
13980 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
13990 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
139a0 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
139b0 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
139c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
139d0 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
139e0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
139f0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
13a00 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
13a10 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
13a20 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
13a30 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
13a40 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
13a50 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
13a60 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
13a70 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
13a80 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
13a90 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
13aa0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
13ab0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
13ac0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
13ad0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
13ae0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
13af0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
13b00 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
13b10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13b20 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13b30 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
13b40 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
13b50 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
13b60 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
13b70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13b80 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
13b90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
13ba0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
13bb0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
13bc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13be0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
13bf0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
13c00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13c10 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
13c20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13c30 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
13c40 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
13c50 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
13c60 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
13c70 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
13c80 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
13c90 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
13ca0 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
13cb0 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
13cc0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
13cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
13ce0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13cf0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
13d00 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
13d10 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
13d20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13d30 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
13d40 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
13d50 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
13d60 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
13d70 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
13d80 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13d90 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
13da0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
13db0 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
13dc0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
13dd0 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
13de0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
13df0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
13e00 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
13e10 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
13e20 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
13e30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
13e40 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
13e50 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
13e60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13e70 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
13e80 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13e90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13ea0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28  ED_CACHE.    if(
13eb0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
13ec0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
13ed0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
13ee0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
13ef0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45  ;.      pBt->isE
13f00 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28  xclusive = (u8)(
13f10 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d  wrflag>1);.    }
13f20 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72  .#endif.  }...tr
13f30 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
13f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13f50 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13f60 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
13f70 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
13f80 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
13f90 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
13fa0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
13fb0 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
13fc0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
13fd0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
13fe0 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
13ff0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
14000 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
14010 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
14020 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
14030 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
14040 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
14050 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
14060 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
14070 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
14080 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14090 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
140a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
140b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
140c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
140d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
140e0 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
140f0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
14100 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
14110 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
14120 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
14130 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
14140 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
14150 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
14160 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
14170 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
14180 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
14190 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
141a0 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
141b0 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
141c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
141d0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
14200 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
14210 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14230 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
14240 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
14250 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14280 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
14290 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
142a0 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
142b0 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
142c0 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
142d0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
142e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
142f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14300 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
14310 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
14320 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
14330 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
14350 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
14360 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
14370 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
14380 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
14390 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
143a0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
143b0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
143c0 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   i);..    rc = p
143d0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
143e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
143f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
14410 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
14420 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
14430 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
14440 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
14450 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
14460 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
14470 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
14480 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
14490 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
144a0 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  EE, pgno);.     
144b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
144c0 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68  OK ) goto set_ch
144d0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
144e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
144f0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
14500 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
14510 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
14520 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
14530 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
14540 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72  ]);.    rc = ptr
14550 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
14560 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
14570 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  REE, pgno);.  }.
14580 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
14590 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
145a0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
145b0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
145c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
145d0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
145e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
145f0 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
14600 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
14610 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
14620 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
14630 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
14640 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
14650 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
14660 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
14670 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
14680 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
14690 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
146a0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
146b0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
146c0 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
146e0 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
146f0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
14700 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
14710 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
14720 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
14730 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
14760 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
14770 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
14780 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
14790 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
147a0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
147b0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
147c0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
147d0 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
147e0 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
147f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
14800 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
14810 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
14820 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
14830 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
14840 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
14850 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
14860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14870 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
14880 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
14890 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
148a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
148b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
148c0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
148d0 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
148e0 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
148f0 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
14900 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
14910 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
14920 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
14930 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
14940 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
14950 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14960 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14970 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
14980 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
14990 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
149a0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
149b0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
149c0 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
149d0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
149e0 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
149f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
14a00 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
14a10 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
14a20 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
14a30 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
14a40 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
14a50 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
14a60 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
14a70 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
14a80 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
14a90 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
14aa0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
14ab0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
14ac0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
14ad0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
14ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
14af0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
14b00 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
14b10 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20  verflow]) ){.   
14b20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
14b30 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
14b40 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
14b50 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
14b60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
14b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
14b90 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
14ba0 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
14bb0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
14bc0 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
14bd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14bf0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
14c00 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
14c10 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
14c20 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
14c30 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
14c40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
14c50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
14c60 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
14c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14c80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
14c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14ca0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
14cb0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
14cc0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
14cd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
14ce0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
14cf0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
14d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14d10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
14d20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
14d30 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
14d40 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
14d50 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
14d60 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
14d70 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
14d80 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
14d90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
14da0 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
14db0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
14dc0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
14dd0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
14de0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
14df0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
14e00 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
14e30 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
14e40 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
14e50 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
14e60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14e70 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
14e80 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
14e90 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
14ea0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
14eb0 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
14ec0 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
14ed0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
14ee0 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  mit.){.  MemPage
14ef0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
14f00 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
14f10 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
14f20 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
14f30 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
14f40 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
14f50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
14f60 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
14f70 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
14f80 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
14f90 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
14fa0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
14fb0 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
14fc0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
14fd0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
14fe0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
14ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15000 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15010 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15020 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
15030 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
15040 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
15050 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
15060 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
15070 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
15080 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
15090 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
150a0 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
150b0 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
150c0 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
150d0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
150e0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
150f0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
15100 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
15110 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
15120 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
15130 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
15140 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
15150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15160 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
15170 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
15180 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
15190 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
151a0 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
151b0 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
151c0 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
151d0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
151e0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
151f0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
15200 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
15210 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
15220 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
15230 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
15240 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
15250 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
15260 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
15270 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
15280 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
15290 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
152a0 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
152b0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
152c0 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
152d0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
152e0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
152f0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
15300 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
15310 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
15320 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
15330 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15340 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
15350 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
15360 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
15370 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
15380 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
15390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
153a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
153b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
153c0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
153d0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
153e0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
153f0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
15400 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
15410 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
15420 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
15430 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
15440 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  ePage);.      if
15450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15460 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
15470 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
15480 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
15490 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
154a0 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
154b0 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
154c0 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
154d0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
154e0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
154f0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
15500 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
15510 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
15520 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
15530 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
15540 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
15550 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
15560 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
15570 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
15580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
155a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
155b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
155c0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
155d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
155e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
155f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
15600 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
15610 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
15620 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
15630 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
15640 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
15650 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
15660 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
15670 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
15680 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
15690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
156a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
156b0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
156c0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
156d0 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
156e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
156f0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
15700 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
15710 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
15720 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
15730 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
15740 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
15750 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
15760 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
15770 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
15780 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
15790 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
157a0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
157b0 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
157c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
157d0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
157e0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
157f0 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
15800 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
15810 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
15820 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
15830 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
15840 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
15850 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
15860 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
15870 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
15880 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
15890 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
158a0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
158b0 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
158c0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
158d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
158e0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
158f0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
15900 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
15910 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
15920 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
15930 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
15940 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
15950 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
15960 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
15970 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
15980 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
15990 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
159a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
159b0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
159c0 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
159d0 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
159e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
159f0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
15a00 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
15a10 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
15a20 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e  astPg){.  Pgno n
15a30 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
15a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15a50 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
15a60 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
15a70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15a80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15a90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15aa0 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
15ab0 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
15ac0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
15ad0 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
15ae0 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
15af0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
15b00 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
15b10 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
15b20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
15b30 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
15b40 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
15b50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
15b60 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
15b70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
15b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
15b90 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
15ba0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
15bb0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
15bc0 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
15bd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15bf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15c00 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
15c10 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
15c20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15c30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15c40 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
15c50 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15c60 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
15c70 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20      if( nFin==0 
15c80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
15c90 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
15ca0 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
15cb0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
15cc0 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
15cd0 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20       ** if nFin 
15ce0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
15cf0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
15d00 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
15d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
15d20 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
15d30 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
15d40 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
15d50 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
15d60 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
15d70 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
15d80 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
15d90 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
15da0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
15db0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
15dc0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
15dd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
15de0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
15df0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
15e00 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
15e10 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 1);.        i
15e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15e40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
15e50 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
15e60 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
15e70 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
15e80 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
15e90 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
15ea0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15eb0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
15ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15ed0 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
15ee0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
15ef0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
15f00 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20  age *pLastPg;.. 
15f10 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
15f20 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
15f30 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
15f40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15f70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15f80 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
15f90 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
15fa0 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
15fb0 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
15fc0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
15fd0 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
15fe0 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
15ff0 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
16000 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
16010 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
16020 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
16030 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
16040 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
16050 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
16060 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
16070 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
16080 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
16090 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
160a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
160b0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
160c0 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
160d0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
160e0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
160f0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
16100 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
16110 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
16120 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
16130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16150 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
16160 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
16170 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16180 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
16190 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
161a0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
161b0 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
161c0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
161d0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
161e0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
161f0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
16200 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
16210 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
16220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16240 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
16250 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
16260 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
16270 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
16280 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  nFin!=0);.      
16290 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
162a0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
162b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
162c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
162d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
162e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
162f0 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
16300 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
16310 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50     while( iLastP
16320 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
16330 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
16340 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
16350 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
16360 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
16370 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
16380 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
16390 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20  ge *pPg;.       
163a0 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47   int rc = btreeG
163b0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
163c0 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  tPg, &pPg, 0);. 
163d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
163e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
163f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16400 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16410 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16420 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
16430 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
16440 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
16450 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16460 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16470 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16480 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61       }.      iLa
164a0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  stPg--;.    }.  
164b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
164c0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
164d0 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67  >pPager, iLastPg
164e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
164f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16500 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
16510 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
16520 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
16530 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
16540 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
16550 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
16560 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
16570 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
16580 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
16590 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
165a0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
165b0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
165c0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
165d0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
165e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
165f0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
16600 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
16610 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
16620 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16630 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
16640 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
16650 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
16660 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
16670 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
16680 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
16690 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
166a0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
166b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
166c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
166d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
166e0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
166f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
16700 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
16710 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
16720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
16730 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
16740 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
16750 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
16760 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
16770 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
16780 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  0, pagerPagecoun
16790 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73  t(pBt));.  }.  s
167a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
167b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
167c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
167d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
167e0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
167f0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
16800 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
16810 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
16820 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
16830 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
16840 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
16850 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
16860 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
16870 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
16880 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
16890 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
168a0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
168b0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
168c0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
168d0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
168e0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
168f0 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
16900 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
16910 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
16920 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
16930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
16940 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
16950 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16960 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16970 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
16980 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
16990 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
169a0 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
169b0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
169c0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
169d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
169e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
169f0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
16a00 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
16a10 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
16a20 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
16a30 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
16a40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
16a50 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
16a60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16a70 20 6f 66 20 70 61 67 65 73 20 74 6f 20 62 65 20   of pages to be 
16a80 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
16a90 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
16aa0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16ab0 65 73 20 6e 6f 20 74 68 65 20 66 72 65 65 6c 69  es no the freeli
16ac0 73 74 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  st */.    Pgno n
16ad0 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
16ae0 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
16af0 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
16b00 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ed */.    Pgno i
16b10 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
16b20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
16b30 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
16b40 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
16b50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16b60 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
16b70 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
16b80 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
16b90 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16ba0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
16bb0 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
16bc0 72 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  rig = pagerPagec
16bd0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
16be0 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
16bf0 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
16c00 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
16c10 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
16c20 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
16c30 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
16c40 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
16c50 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
16c60 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
16c70 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
16c80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
16c90 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
16ca0 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
16cb0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
16cc0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
16cd0 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
16ce0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
16cf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16d00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16d10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
16d20 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
16d30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
16d40 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72  [36]);.    nEntr
16d50 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
16d60 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d  ize/5;.    nPtrm
16d70 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
16d80 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
16d90 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
16da0 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20  ry)/nEntry;.    
16db0 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
16dc0 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
16dd0 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
16de0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
16df0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
16e00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
16e10 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
16e20 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n--;.    }.    w
16e30 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
16e40 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
16e50 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
16e60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
16e70 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
16e80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
16e90 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
16ea0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16eb0 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28  _BKPT;..    for(
16ec0 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
16ed0 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
16ee0 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
16ef0 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
16f00 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
16f10 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b  t, nFin, iFree);
16f20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
16f30 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
16f40 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
16f50 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
16f60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16f70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  E_OK;.      rc =
16f80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16f90 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
16fa0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
16fb0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
16fc0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
16fd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
16fe0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16ff0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
17000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
17010 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
17020 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
17030 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Fin);.    }.    
17040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17050 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
17060 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
17070 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
17080 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
17090 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
170a0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
170b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
170c0 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
170d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
170e0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
170f0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
17100 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
17110 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
17120 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
17130 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
17140 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
17150 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
17160 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
17170 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
17180 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
17190 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
171a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
171b0 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
171c0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
171d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
171e0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
171f0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
17200 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
17210 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
17220 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
17230 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
17240 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
17250 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
17260 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
17270 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
17280 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
17290 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
172a0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
172b0 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
172c0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
172d0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
172e0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
172f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
17300 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
17310 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
17320 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
17330 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
17340 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
17350 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
17360 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
17370 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
17380 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
17390 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
173a0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
173b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
173c0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
173d0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
173e0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
173f0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
17400 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
17410 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
17420 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
17430 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
17440 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
17450 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
17460 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
17470 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
17480 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
17490 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
174a0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
174b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
174c0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
174d0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
174e0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
174f0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
17500 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
17510 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
17520 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
17530 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
17540 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
17550 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
17560 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
17570 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
17580 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
17590 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
175a0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
175b0 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
175c0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
175d0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
175e0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
175f0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
17600 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
17610 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
17620 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
17630 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
17640 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
17650 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
17660 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
17670 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
17680 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
17690 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
176a0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
176b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
176c0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
176d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
176e0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
176f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17700 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17710 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
17720 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17730 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
17740 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
17750 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
17760 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
17770 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
17780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17790 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
177a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
177b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
177c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
177d0 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
177e0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
177f0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
17800 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
17810 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
17820 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17830 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17840 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17850 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17860 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
17870 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
17880 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
17890 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
178a0 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
178b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
178c0 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
178d0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
178e0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
178f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17900 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
17910 70 43 73 72 3b 0a 20 20 61 73 73 65 72 74 28 20  pCsr;.  assert( 
17920 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
17930 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20  sMutex(p) );..  
17940 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
17950 63 75 72 73 6f 72 20 68 65 6c 64 20 6f 70 65 6e  cursor held open
17960 20 62 79 20 74 68 69 73 20 62 2d 74 72 65 65 20   by this b-tree 
17970 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20 6f  connection. If o
17980 6e 65 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a 20  ne exists,.  ** 
17990 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  then the transac
179a0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 77  tion will be dow
179b0 6e 67 72 61 64 65 64 20 74 6f 20 61 20 72 65 61  ngraded to a rea
179c0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
179d0 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20  on.  ** instead 
179e0 6f 66 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 63  of actually conc
179f0 6c 75 64 65 64 2e 20 41 20 73 75 62 73 65 71 75  luded. A subsequ
17a00 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 6d  ent call to Comm
17a10 69 74 50 68 61 73 65 54 77 6f 28 29 20 0a 20 20  itPhaseTwo() .  
17a20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28 29  ** or Rollback()
17a30 20 77 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65   will finish the
17a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
17a50 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
17a60 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  base.  */.  for(
17a70 70 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCsr=pBt->pCurso
17a80 72 3b 20 70 43 73 72 20 26 26 20 70 43 73 72 2d  r; pCsr && pCsr-
17a90 3e 70 42 74 72 65 65 21 3d 70 3b 20 70 43 73 72  >pBtree!=p; pCsr
17aa0 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a 20  =pCsr->pNext);. 
17ab0 20 61 73 73 65 72 74 28 20 70 43 73 72 3d 3d 30   assert( pCsr==0
17ac0 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54   || p->inTrans>T
17ad0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20  RANS_NONE );..  
17ae0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
17af0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28  tent(pBt);.  if(
17b00 20 70 43 73 72 20 29 7b 0a 20 20 20 20 64 6f 77   pCsr ){.    dow
17b10 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
17b20 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
17b30 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
17b40 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
17b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17b60 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
17b70 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
17b80 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
17b90 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
17ba0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
17bb0 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
17bc0 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
17bd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17be0 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
17bf0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
17c00 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
17c10 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
17c20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
17c30 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
17c40 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
17c50 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
17c60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
17c70 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
17c80 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
17c90 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
17ca0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
17cb0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
17cc0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
17cd0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
17ce0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
17cf0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
17d00 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
17d10 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
17d20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
17d30 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
17d40 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
17d50 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
17d60 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
17d70 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
17d80 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
17d90 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
17da0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
17db0 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
17dc0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
17dd0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
17de0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
17df0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
17e00 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
17e10 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
17e20 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
17e30 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
17e40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17e50 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
17e60 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
17e70 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
17e80 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
17e90 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
17ea0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
17eb0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
17ec0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
17ed0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
17ee0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
17ef0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
17f00 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
17f10 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
17f20 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
17f30 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
17f40 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
17f50 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
17f60 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
17f70 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
17f80 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
17f90 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
17fa0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
17fb0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
17fc0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
17fd0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
17fe0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
17ff0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
18000 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18010 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
18020 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18030 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
18040 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
18050 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
18060 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
18070 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18080 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
18090 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
180a0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
180b0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
180c0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
180d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
180e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
180f0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
18100 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18110 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
18120 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18130 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
18140 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
18150 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
18160 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
18170 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
18180 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
18190 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
181a0 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
181b0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
181c0 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
181d0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
181e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
181f0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
18200 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
18210 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
18220 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
18230 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
18240 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
18250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18260 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
18270 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
18280 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
182a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
182b0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
182c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
182d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
182e0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
182f0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
18300 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
18310 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18320 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18340 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
18350 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
18360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18370 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
18380 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
18390 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
183a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
183b0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
183c0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
183d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
183e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
183f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18400 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20  itPhaseTwo(p);. 
18410 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
18420 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18430 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
18440 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
18450 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18460 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f  r of write-curso
18470 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
18480 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
18490 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
184a0 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
184b0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
184c0 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
184d0 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
184e0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  efined..**.** Fo
184f0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
18500 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
18510 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
18520 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
18530 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
18540 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  of writing to th
18550 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74  e databse.  That
18560 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f   means the curso
18570 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61  r was.** origina
18580 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  lly opened for w
18590 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63  riting and the c
185a0 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65  ursor has not be
185b0 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20   disabled.** by 
185c0 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65  having its state
185d0 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53   changed to CURS
185e0 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61  OR_FAULT..*/.sta
185f0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
18600 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
18610 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
18620 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
18630 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
18640 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
18650 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
18660 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
18670 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
18680 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
18690 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
186a0 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
186b0 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
186c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
186d0 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
186e0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
186f0 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
18700 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
18710 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
18720 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
18730 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
18740 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
18750 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
18760 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
18770 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
18780 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
18790 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
187a0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
187b0 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
187c0 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
187d0 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
187e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
187f0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
18800 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
18810 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
18820 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
18830 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
18840 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
18850 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
18860 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
18870 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
18880 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
18890 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
188a0 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
188b0 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
188c0 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
188d0 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
188e0 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
188f0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
18900 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
18910 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
18920 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
18930 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
18940 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
18950 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
18960 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
18970 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71  tCursor *p;.  sq
18980 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18990 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70  pBtree);.  for(p
189a0 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
189b0 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
189c0 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
189d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
189e0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
189f0 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20  ;.    p->eState 
18a00 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
18a10 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72      p->skip = er
18a20 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69  rCode;.    for(i
18a30 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b  =0; i<=p->iPage;
18a40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
18a50 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
18a60 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d  ge[i]);.      p-
18a70 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
18a80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18a90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
18aa0 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
18ab0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
18ac0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
18ad0 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
18ae0 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
18af0 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
18b00 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
18b10 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
18b20 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
18b30 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
18b40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
18b50 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
18b60 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
18b70 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
18b80 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
18b90 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
18ba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
18bb0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
18bc0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
18bd0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
18be0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
18bf0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
18c00 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
18c10 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a  back(Btree *p){.
18c20 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
18c30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18c40 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
18c50 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65  Page1;..  sqlite
18c60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18c70 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
18c80 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
18c90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18ca0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
18cb0 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  HE.  if( rc!=SQL
18cc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
18cd0 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69   This is a horri
18ce0 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41  ble situation. A
18cf0 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29  n IO or malloc()
18d00 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
18d10 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72  whilst.    ** tr
18d20 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72  ying to save cur
18d30 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49  sor positions. I
18d40 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
18d50 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20  omatic rollback 
18d60 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  (as.    ** the r
18d70 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74  esult of a const
18d80 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20  raint, malloc() 
18d90 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72  failure or IO er
18da0 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a  ror) then .    *
18db0 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20  * the cache may 
18dc0 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  be internally in
18dd0 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20  consistent (not 
18de0 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72  contain valid tr
18df0 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77  ees) so.    ** w
18e00 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20  e cannot simply 
18e10 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
18e20 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
18e30 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a  Instead, abort .
18e40 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69      ** all queri
18e50 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  es that may be u
18e60 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  sing any of the 
18e70 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69  cursors that fai
18e80 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20  led to save..   
18e90 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
18ea0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
18eb0 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23  rs(p, rc);.  }.#
18ec0 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
18ed0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66  egrity(p);..  if
18ee0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
18ef0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
18f00 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61   int rc2;..    a
18f10 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
18f20 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
18f30 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
18f40 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
18f50 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
18f60 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
18f70 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
18f80 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
18f90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
18fa0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
18fb0 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
18fc0 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
18fd0 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
18fe0 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74  ** call btreeGet
18ff0 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
19000 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
19010 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
19020 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
19030 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
19040 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61    if( btreeGetPa
19050 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
19060 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
19070 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
19080 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
19090 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
190a0 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
190b0 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
190c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
190d0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
190e0 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
190f0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
19100 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19110 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19120 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19130 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
19140 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
19150 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
19160 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65  ction can can be
19170 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
19180 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
19190 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
191a0 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
191b0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
191c0 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
191d0 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
191e0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
191f0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
19200 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
19210 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
19220 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
19230 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
19240 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
19250 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
19260 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
19270 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
19280 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
19290 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
192a0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
192b0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
192c0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
192d0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
192e0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
192f0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
19300 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
19310 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
19320 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
19330 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
19340 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
19350 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
19360 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
19370 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
19380 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
19390 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
193a0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
193b0 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
193c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
193d0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
193e0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
193f0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
19400 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
19410 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
19420 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
19430 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
19440 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
19450 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
19460 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
19470 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
19480 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
19490 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
194a0 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
194b0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
194c0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
194d0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
194e0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
194f0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
19500 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
19510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19520 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
19530 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
19540 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
19550 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19560 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
19570 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
19590 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
195a0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
195b0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d  ( pBt->readOnly=
195c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
195d0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
195e0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
195f0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
19600 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20  epoint );.  if( 
19610 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73  NEVER(p->inTrans
19620 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  !=TRANS_WRITE ||
19630 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
19640 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19650 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d  TE_INTERNAL;.  }
19660 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
19670 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
19680 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
19690 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74  E );.    /* At t
196a0 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
196b0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
196c0 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
196d0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20  epoint with.    
196e0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
196f0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
19700 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
19710 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
19720 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  .    ** SQL stat
19730 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
19740 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
19750 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
19760 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  ck any.    ** su
19770 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
19780 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
19790 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
197a0 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
197b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
197c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
197d0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
197e0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
197f0 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ment);.  }.  sql
19800 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19810 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19820 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
19830 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
19840 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
19850 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
19860 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
19870 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
19880 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
19890 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
198a0 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
198b0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
198c0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
198d0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
198e0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
198f0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
19900 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
19910 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
19920 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
19930 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
19940 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
19950 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
19960 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
19970 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
19980 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
19990 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
199a0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
199b0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
199c0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
199d0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
199e0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
199f0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
19a00 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
19a10 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
19a20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
19a30 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
19a40 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
19a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19a60 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
19a70 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
19a80 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
19a90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19aa0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
19ab0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
19ac0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
19ad0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19ae0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
19af0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
19b00 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
19b10 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
19b20 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
19b30 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
19b40 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
19b50 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
19b60 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
19b70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
19b80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19ba0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
19bb0 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
19bc0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
19bd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19be0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e   ){.      rc = n
19bf0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
19c00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19c10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19c20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
19c40 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
19c50 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
19c60 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
19c70 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
19c80 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
19c90 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
19ca0 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
19cb0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
19cc0 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
19cd0 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
19ce0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
19cf0 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
19d00 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
19d10 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
19d20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
19d30 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
19d40 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
19d50 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
19d60 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
19d70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tion..**.** If w
19d80 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
19d90 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
19da0 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
19db0 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
19dc0 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
19dd0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
19de0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
19df0 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
19e00 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
19e10 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
19e20 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
19e30 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
19e40 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
19e50 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
19e60 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
19e70 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
19e80 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
19e90 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
19ea0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
19eb0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
19ec0 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
19ed0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19ee0 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
19ef0 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
19f00 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
19f10 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
19f20 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
19f30 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
19f40 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
19f50 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
19f60 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
19f70 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
19f80 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
19f90 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
19fa0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
19fb0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
19fc0 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
19fd0 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
19fe0 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
19ff0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a000 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
1a010 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
1a020 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
1a030 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
1a040 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
1a050 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
1a060 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
1a070 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  ion..**.** No ch
1a080 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
1a090 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1a0a0 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
1a0b0 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
1a0c0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
1a0d0 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
1a0e0 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
1a0f0 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
1a100 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
1a110 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
1a120 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1a130 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
1a140 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62  eeCursorSize() b
1a150 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a  ytes of memory .
1a160 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
1a170 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20   pCur have been 
1a180 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61  zeroed by the ca
1a190 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a1a0 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1a1b0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a1e0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1a1f0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1a220 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1a230 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1a240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a260 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1a270 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1a280 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1a290 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1a2a0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1a2b0 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1a2c0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1a2d0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1a300 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1a310 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1a320 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1a330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1a340 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1a350 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1a360 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1a370 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1a380 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1a390 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1a3a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1a3b0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1a3c0 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1a3d0 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1a3e0 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1a3f0 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1a400 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1a410 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1a420 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1a430 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1a440 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1a450 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1a460 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1a470 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1a480 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1a490 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1a4a0 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1a4b0 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1a4c0 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1a4d0 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1a4e0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1a4f0 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1a500 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1a510 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1a520 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1a530 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1a540 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1a550 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1a560 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1a570 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1a580 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1a590 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1a5a0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1a5b0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1a5c0 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1a5d0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1a5e0 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1a5f0 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  && pBt->readOnly
1a600 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1a610 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1a620 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1a630 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61 67  e==1 && pagerPag
1a640 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1a650 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1a660 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a  ITE_EMPTY;.  }..
1a670 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1a680 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1a690 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1a6a0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1a6b0 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1a6c0 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1a6d0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1a6e0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1a6f0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1a700 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1a710 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1a720 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1a730 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1a740 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1a750 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1a760 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1a770 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
1a780 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
1a790 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1a7a0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1a7b0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1a7c0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1a7d0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1a7e0 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1a7f0 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1a800 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1a810 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
1a820 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
1a830 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1a840 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1a850 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1a860 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1a8a0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a8d0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1a8e0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1a8f0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a920 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1a930 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1a940 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1a950 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1a960 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1a970 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1a980 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1a990 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1a9c0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1a9d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1a9e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a9f0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1aa00 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1aa10 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1aa20 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1aa30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1aa40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1aa50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1aa60 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1aa70 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1aa80 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1aa90 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1aaa0 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1aab0 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1aac0 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1aad0 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1aae0 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1aaf0 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1ab00 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1ab10 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1ab20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1ab30 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1ab40 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1ab50 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1ab60 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1ab70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ab80 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1ab90 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1aba0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
1abb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1abc0 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1abd0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63  value of every c
1abe0 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d  ursor in the sam
1abf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1ac00 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68  ** as pCur and h
1ac10 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72  aving the same r
1ac20 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
1ac30 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61  as pCur.  The va
1ac40 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
1ac50 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f   iRowid..**.** O
1ac60 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77  nly positive row
1ac70 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  id values are co
1ac80 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66  nsidered valid f
1ac90 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a  or this cache..*
1aca0 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69  * The cache is i
1acb0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1acc0 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  ro, indicating a
1acd0 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e  n invalid cache.
1ace0 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c  .** A btree will
1acf0 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20   work fine with 
1ad00 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1ad10 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73   rowids.  We jus
1ad20 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68  t cannot.** cach
1ad30 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  e zero or negati
1ad40 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68  ve rowids, which
1ad50 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68   means tables th
1ad60 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a  at use zero or.*
1ad70 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  * negative rowid
1ad80 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
1ad90 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75  ttle slower.  Bu
1ada0 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a  t in practice, z
1adb0 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69  ero.** or negati
1adc0 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65  ve rowids are ve
1add0 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74  ry uncommon so t
1ade0 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  his should not b
1adf0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
1ae00 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1ae10 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
1ae20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1ae30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
1ae40 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f  owid){.  BtCurso
1ae50 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43  r *p;.  for(p=pC
1ae60 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ur->pBt->pCursor
1ae70 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ae80 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1ae90 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
1aea0 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65  oRoot ) p->cache
1aeb0 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  dRowid = iRowid;
1aec0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1aed0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1aee0 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f  ==iRowid );.}../
1aef0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1af00 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72  cached rowid for
1af10 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
1af20 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f  r.  A negative o
1af30 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e  r zero.** return
1af40 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1af50 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
1af60 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
1af70 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a   and should be.*
1af80 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74  * ignored.  If t
1af90 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68  he rowid cache h
1afa0 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
1afb0 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61  been set, then a
1afc0 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75  .** zero is retu
1afd0 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rned..*/.sqlite3
1afe0 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
1aff0 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69  reeGetCachedRowi
1b000 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1b010 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1b020 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d  ->cachedRowid;.}
1b030 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1b040 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
1b050 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1b060 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
1b070 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
1b080 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
1b090 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
1b0a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
1b0b0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
1b0c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
1b0d0 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
1b0e0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
1b0f0 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
1b100 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
1b110 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1b120 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1b130 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1b140 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
1b150 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1b160 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
1b170 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
1b180 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
1b190 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
1b1a0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
1b1b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
1b1c0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
1b1d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1b1e0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1b1f0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
1b200 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
1b210 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
1b220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1b230 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1b240 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1b250 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1b260 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
1b270 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1b280 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
1b290 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1b2a0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
1b2b0 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
1b2c0 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
1b2d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b2e0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
1b2f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1b310 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1b320 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1b330 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1b340 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1b350 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1b360 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1b370 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1b380 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
1b390 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
1b3a0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
1b3b0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
1b3c0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
1b3d0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
1b3e0 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
1b3f0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
1b400 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
1b410 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
1b420 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
1b430 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
1b440 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
1b450 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
1b460 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
1b470 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
1b480 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
1b490 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
1b4a0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1b4b0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
1b4c0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1b4d0 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
1b4e0 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
1b4f0 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
1b500 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
1b510 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
1b520 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
1b530 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
1b540 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
1b550 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
1b560 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
1b570 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
1b580 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
1b590 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
1b5a0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
1b5b0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
1b5c0 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
1b5d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1b5e0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
1b5f0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1b600 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b610 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
1b620 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
1b630 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1b640 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
1b650 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
1b660 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
1b670 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1b680 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
1b690 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1b6a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
1b6b0 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
1b6c0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1b6d0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1b6e0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1b6f0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1b700 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1b710 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1b720 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1b730 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1b740 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1b750 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1b760 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1b770 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1b780 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1b790 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1b7a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1b7b0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1b7c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1b7d0 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1b7e0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1b7f0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1b800 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1b810 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1b820 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1b830 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
1b840 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1b850 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1b860 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
1b870 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
1b880 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
1b890 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
1b8a0 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
1b8b0 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
1b8c0 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
1b8d0 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
1b8e0 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
1b930 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
1b980 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72    \.    btreePar
1b9d0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1b9e0 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1b9f0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1ba00 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
1ba10 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1ba20 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ba60 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1bab0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1bac0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bb00 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
1bb10 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
1bb20 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1bb30 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1bb40 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
1bb50 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
1bb60 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
1bb70 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1bb80 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
1bb90 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1bba0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
1bbb0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
1bbc0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
1bbd0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
1bbe0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
1bbf0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
1bc00 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1bc10 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
1bc20 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
1bc30 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1bc40 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
1bc50 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1bc60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1bc70 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1bc80 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1bc90 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1bca0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1bcb0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1bcc0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1bcd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1bcf0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1bd00 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1bd10 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1bd20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1bd30 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1bd40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1bd50 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1bd60 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
1bd70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
1bd80 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1bd90 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
1bda0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1bdb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1bdc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bdd0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1bde0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1bdf0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
1be00 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
1be10 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
1be20 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
1be30 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
1be40 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
1be50 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1be60 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1be70 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
1be80 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
1be90 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
1bea0 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
1beb0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
1bec0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
1bed0 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
1bee0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
1bef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bf00 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1bf10 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1bf20 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1bf30 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1bf40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1bf50 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1bf60 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1bf70 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1bf80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bf90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1bfa0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1bfb0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
1bfc0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1bfd0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
1bfe0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1bff0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1c000 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
1c010 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
1c020 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
1c030 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
1c040 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
1c050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c060 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
1c070 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
1c080 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1c090 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
1c0a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c0b0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1c0c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1c0d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1c0e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c0f0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
1c100 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
1c110 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
1c120 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1c130 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1c140 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
1c150 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
1c160 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
1c170 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
1c180 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
1c190 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
1c1a0 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
1c1b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1c1c0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
1c1d0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
1c1e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
1c1f0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1c200 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1c210 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
1c220 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1c230 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
1c240 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1c250 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
1c260 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
1c270 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
1c280 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
1c290 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
1c2a0 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
1c2b0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
1c2c0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
1c2d0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
1c2e0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
1c2f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1c300 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
1c310 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1c320 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
1c330 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
1c340 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
1c350 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
1c360 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
1c370 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
1c380 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1c390 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1c3a0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
1c3b0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
1c3c0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
1c3d0 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
1c3e0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
1c3f0 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
1c400 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
1c410 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
1c420 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
1c430 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
1c440 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
1c450 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1c460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1c470 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
1c480 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c4a0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
1c4b0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
1c4c0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
1c4d0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1c4e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1c4f0 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
1c500 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1c510 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1c520 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
1c530 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
1c540 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
1c550 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
1c560 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
1c570 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1c580 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
1c590 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
1c5a0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
1c5b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c5c0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
1c5d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c5e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1c5f0 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
1c600 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
1c610 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1c620 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
1c630 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
1c640 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1c650 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
1c660 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
1c670 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
1c680 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
1c690 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
1c6a0 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
1c6b0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
1c6c0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
1c6d0 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
1c6e0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
1c6f0 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
1c700 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
1c710 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
1c720 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
1c730 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
1c740 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
1c750 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
1c760 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1c770 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1c780 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
1c790 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
1c7a0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
1c7b0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
1c7c0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
1c7d0 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
1c7e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1c7f0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1c800 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
1c810 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
1c820 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  <=pagerPagecount
1c830 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1c840 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1c850 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
1c860 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
1c870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c880 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
1c890 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
1c8a0 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
1c8b0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
1c8c0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
1c8d0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1c8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c8f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1c900 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
1c910 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1c920 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1c940 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1c950 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
1c960 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1c970 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c980 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
1c990 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c9a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
1c9b0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
1c9c0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1c9d0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
1c9e0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
1c9f0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
1ca00 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
1ca10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1ca20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1ca30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ca40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1ca50 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
1ca60 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
1ca70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
1ca80 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
1ca90 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
1caa0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
1cab0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
1cac0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1cad0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
1cae0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
1caf0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1cb00 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
1cb10 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
1cb20 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1cb30 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
1cb40 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
1cb50 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
1cb60 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
1cb70 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
1cb80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1cb90 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
1cba0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
1cbb0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
1cbc0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
1cbd0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1cbe0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
1cbf0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1cc00 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1cc10 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
1cc20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1cc30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
1cc40 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
1cc50 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
1cc60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1cc70 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
1cc80 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cca0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1ccb0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
1ccc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ccd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1cce0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
1ccf0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
1cd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1cd10 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
1cd20 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
1cd30 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
1cd40 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
1cd50 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
1cd60 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
1cd70 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
1cd80 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
1cd90 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
1cda0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
1cdb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1cdc0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1cdd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
1cde0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1cdf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ce00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ce10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1ce20 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
1ce30 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
1ce40 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
1ce50 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
1ce60 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
1ce70 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1ce80 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1ce90 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
1cea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1ceb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1cec0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ced0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1cee0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
1cef0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1cf00 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
1cf10 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
1cf20 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1cf30 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
1cf40 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
1cf50 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
1cf60 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
1cf70 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
1cf80 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1cf90 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
1cfa0 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
1cfb0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
1cfc0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
1cfd0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
1cfe0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
1cff0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1d000 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
1d010 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
1d020 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
1d030 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1d040 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
1d050 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
1d060 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
1d070 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
1d080 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
1d090 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
1d0a0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
1d0b0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
1d0c0 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
1d0d0 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
1d0e0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
1d0f0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
1d100 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
1d110 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1d120 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1d130 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1d140 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
1d150 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
1d160 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
1d170 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1d180 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
1d190 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
1d1a0 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
1d1b0 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
1d1c0 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
1d1d0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
1d1e0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
1d1f0 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
1d200 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
1d210 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1d220 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1d230 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
1d240 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
1d250 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
1d260 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
1d270 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
1d280 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
1d290 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
1d2a0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
1d2b0 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
1d2c0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
1d2d0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
1d2e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
1d2f0 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
1d300 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1d310 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
1d320 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
1d330 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
1d340 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
1d350 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
1d360 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
1d370 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
1d380 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
1d390 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
1d3a0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
1d3b0 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
1d3c0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1d3d0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1d3e0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1d3f0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1d400 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
1d410 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
1d420 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
1d430 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
1d440 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
1d450 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
1d460 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
1d470 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
1d480 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
1d490 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
1d4a0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
1d4b0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
1d4c0 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
1d4d0 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
1d4e0 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
1d4f0 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
1d500 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
1d510 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
1d520 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d530 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
1d540 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
1d550 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1d560 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1d570 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
1d580 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
1d590 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
1d5a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1d5b0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1d5c0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1d5d0 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
1d5e0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
1d5f0 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
1d600 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1d610 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1d620 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1d630 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1d640 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1d650 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
1d660 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1d670 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
1d680 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1d690 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
1d6a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
1d6b0 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
1d6c0 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
1d6d0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
1d6e0 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d  ? 0 : (int)pCur-
1d6f0 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
1d700 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74  if( NEVER(offset
1d710 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
1d720 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20  ->info.nData) . 
1d730 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70    || &aPayload[p
1d740 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1d750 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
1d760 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
1d770 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e].  ){.    /* T
1d780 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
1d790 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
1d7a0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
1d7b0 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
1d7c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d7d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d7e0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
1d7f0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
1d800 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
1d810 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
1d820 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
1d830 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
1d840 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1d850 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1d860 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
1d870 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
1d880 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
1d890 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1d8a0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
1d8b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
1d8c0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1d8d0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
1d8e0 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
1d8f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
1d900 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
1d910 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
1d920 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
1d930 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
1d940 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1d950 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1d960 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1d970 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
1d980 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
1d990 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1d9a0 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
1d9b0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
1d9c0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
1d9d0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
1d9e0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1d9f0 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
1da00 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
1da10 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1da20 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1da30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
1da40 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1da50 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
1da60 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
1da70 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
1da80 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1da90 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
1daa0 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
1dab0 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
1dac0 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
1dad0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
1dae0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1daf0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1db00 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
1db10 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
1db20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1db30 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
1db40 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
1db50 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
1db60 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
1db70 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
1db80 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
1db90 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
1dba0 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
1dbb0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
1dbc0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1dbd0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1dbe0 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1dbf0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
1dc00 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
1dc10 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
1dc20 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
1dc30 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
1dc40 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
1dc50 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
1dc60 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
1dc70 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
1dc80 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
1dc90 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61     /* nOvfl is a
1dca0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
1dcb0 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f   If it were zero
1dcc0 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77  , fetchPayload w
1dcd0 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20  ould have.      
1dce0 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73  ** been used ins
1dcf0 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75  tead of this rou
1dd00 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  tine. */.      i
1dd10 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29  f( ALWAYS(nOvfl)
1dd20 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1dd30 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
1dd40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1dd50 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
1dd60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1dd70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1dd80 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1dd90 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
1dda0 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
1ddb0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
1ddc0 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
1ddd0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
1dde0 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
1ddf0 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
1de00 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
1de10 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
1de20 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
1de30 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
1de40 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
1de50 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
1de60 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
1de70 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
1de80 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
1de90 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
1dea0 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
1deb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
1dec0 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
1ded0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
1dee0 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
1def0 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
1df00 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1df10 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
1df20 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
1df30 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1df40 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
1df50 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
1df60 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1df70 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
1df80 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1df90 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
1dfa0 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
1dfb0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
1dfc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1dfd0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
1dfe0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1dff0 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
1e000 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
1e010 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1e020 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
1e030 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
1e040 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
1e050 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
1e060 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
1e070 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1e080 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1e090 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1e0a0 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
1e0b0 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
1e0c0 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
1e0d0 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
1e0e0 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
1e0f0 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
1e100 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
1e110 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
1e120 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
1e130 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
1e140 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
1e150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1e160 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
1e170 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e180 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
1e190 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
1e1a0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
1e1b0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
1e1c0 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
1e1d0 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
1e1e0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
1e1f0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
1e200 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
1e210 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
1e220 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
1e230 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
1e240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e250 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
1e260 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
1e270 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
1e280 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
1e290 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
1e2a0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
1e2b0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
1e2c0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
1e2d0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
1e2e0 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67  */.        DbPag
1e2f0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
1e300 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1e310 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1e320 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
1e330 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
1e340 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  age, &pDbPage);.
1e350 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1e360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e370 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
1e380 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1e390 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
1e3a0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
1e3b0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
1e3c0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
1e3d0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
1e3e0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20              a = 
1e400 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
1e410 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1e420 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
1e430 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
1e440 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
1e450 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
1e460 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e470 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e480 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
1e490 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
1e4a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74  0;.          amt
1e4b0 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20   -= a;.         
1e4c0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
1e4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e4e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
1e4f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e500 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
1e510 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e520 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1e530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e540 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
1e550 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
1e560 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
1e570 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
1e580 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
1e590 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
1e5a0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
1e5b0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
1e5c0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
1e5d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1e5e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1e5f0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
1e600 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
1e610 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
1e620 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
1e630 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
1e640 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
1e650 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
1e660 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
1e670 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e680 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
1e690 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
1e6a0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
1e6b0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
1e6c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1e6d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e6e0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1e6f0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1e700 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1e710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e720 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1e730 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e740 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1e750 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1e760 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1e770 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e780 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ge] );.    if( p
1e790 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
1e7a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1e7b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e7c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e7d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
1e7e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e7f0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
1e800 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e810 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
1e820 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
1e830 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
1e840 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
1e850 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 20  har*)pBuf, 0);. 
1e860 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e870 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1e880 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1e890 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1e8a0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1e8b0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1e8c0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1e8d0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1e8e0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1e8f0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1e900 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1e910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1e920 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1e930 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1e940 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1e950 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1e960 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1e970 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1e980 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1e990 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1e9a0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1e9b0 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1e9c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e9d0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1e9e0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1e9f0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1ea00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1ea10 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1ea20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ea30 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1ea40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ea50 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1ea60 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1ea70 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ea80 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1ea90 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1eaa0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1eab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1eac0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ead0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1eae0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1eaf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1eb00 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1eb10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1eb20 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1eb30 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1eb40 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1eb50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1eb60 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1eb70 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1eb80 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1eb90 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1eba0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1ebb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1ebc0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1ebd0 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
1ebe0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1ebf0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
1ec00 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
1ec10 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
1ec20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
1ec30 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1ec40 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
1ec50 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
1ec60 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1ec70 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
1ec80 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
1ec90 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
1eca0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
1ecb0 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
1ecc0 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
1ecd0 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
1ece0 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
1ecf0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1ed00 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
1ed10 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
1ed20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ed30 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
1ed40 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
1ed50 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
1ed60 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
1ed70 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
1ed80 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
1ed90 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
1eda0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
1edb0 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
1edc0 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
1edd0 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
1ede0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
1edf0 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
1ee00 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
1ee10 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
1ee20 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
1ee30 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
1ee40 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1ee50 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
1ee60 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
1ee70 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
1ee80 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
1ee90 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
1eea0 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
1eeb0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
1eec0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1eed0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
1eee0 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
1eef0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
1ef00 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
1ef10 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
1ef20 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
1ef30 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
1ef40 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
1ef50 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
1ef60 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1ef70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ef80 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
1ef90 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1efa0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1efb0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1efc0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1efd0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
1efe0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1eff0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1f000 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1f010 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
1f020 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
1f030 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
1f040 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
1f050 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
1f060 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1f070 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1f080 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1f090 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33    u32 nKey;.  u3
1f0a0 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  2 nLocal;..  ass
1f0b0 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
1f0c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1f0d0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1f0e0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
1f0f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f100 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f110 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1f120 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f130 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
1f140 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1f150 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1f160 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f170 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1f180 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1f190 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
1f1a0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1f1b0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1f1c0 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
1f1d0 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
1f1e0 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
1f1f0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1f200 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
1f210 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
1f220 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1f230 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
1f240 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
1f250 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
1f260 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
1f270 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f280 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
1f290 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
1f2a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f2b0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c  ;.    if( nLocal
1f2c0 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  >nKey ){.      n
1f2d0 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20  Local = nKey;.  
1f2e0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20    }.  }.  *pAmt 
1f2f0 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
1f300 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
1f310 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
1f320 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
1f330 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
1f340 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
1f350 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
1f360 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
1f370 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
1f380 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
1f390 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
1f3a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1f3b0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
1f3c0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
1f3d0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
1f3e0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
1f3f0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
1f400 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
1f410 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
1f420 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
1f430 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
1f440 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
1f450 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
1f460 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
1f470 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
1f480 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
1f490 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
1f4a0 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
1f4b0 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
1f4c0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
1f4d0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
1f4e0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
1f4f0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
1f500 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
1f510 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
1f520 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
1f530 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
1f540 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
1f550 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
1f560 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
1f570 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
1f580 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
1f590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f5a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1f5b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1f5c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1f5d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f5e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f5f0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1f600 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1f610 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
1f620 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
1f630 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
1f640 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
1f650 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
1f660 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
1f670 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
1f680 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1f690 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28  pAmt){.  assert(
1f6a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f6b0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1f6c0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1f6d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1f6e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1f6f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1f700 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f710 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
1f720 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
1f730 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1f740 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
1f750 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f760 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1f770 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
1f780 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
1f790 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
1f7a0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
1f7b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1f7c0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
1f7d0 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
1f7e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
1f7f0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
1f800 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
1f810 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
1f820 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
1f830 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
1f840 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
1f850 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
1f860 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
1f870 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
1f880 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
1f890 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
1f8a0 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
1f8b0 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
1f8c0 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
1f8d0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
1f8e0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1f8f0 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
1f900 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1f910 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
1f920 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
1f930 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
1f940 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1f950 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
1f960 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f970 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1f980 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f990 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1f9a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f9b0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
1f9c0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66  AX_DEPTH );.  if
1f9d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
1f9e0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
1f9f0 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
1fa00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1fa10 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1fa20 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1fa30 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
1fa40 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69   &pNewPage);.  i
1fa50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1fa60 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
1fa70 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
1fa80 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
1fa90 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
1faa0 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
1fab0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1fac0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1fad0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1fae0 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
1faf0 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d  l<1 || pNewPage-
1fb00 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61  >intKey!=pCur->a
1fb10 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79  pPage[i]->intKey
1fb20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1fb30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1fb40 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1fb50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1fb60 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1fb70 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
1fb80 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
1fb90 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
1fba0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
1fbb0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
1fbc0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
1fbd0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
1fbe0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
1fbf0 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
1fc00 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
1fc10 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
1fc20 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
1fc30 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
1fc40 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
1fc50 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
1fc60 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
1fc70 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
1fc80 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
1fc90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
1fca0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
1fcb0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
1fcc0 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
1fcd0 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
1fce0 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
1fcf0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
1fd00 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
1fd10 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
1fd20 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
1fd30 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
1fd40 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
1fd50 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
1fd60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1fd70 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
1fd80 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
1fd90 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
1fda0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
1fdb0 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
1fdc0 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
1fdd0 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
1fde0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1fdf0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
1fe00 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
1fe10 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1fe20 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
1fe30 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
1fe40 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
1fe50 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1fe60 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
1fe70 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1fe80 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
1fe90 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
1fea0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
1feb0 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
1fec0 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
1fed0 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
1fee0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1fef0 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
1ff00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ff10 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ff20 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ff30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ff40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ff50 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1ff60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1ff70 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
1ff80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ff90 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1ffa0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1ffb0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
1ffc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
1ffd0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1ffe0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1fff0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
20000 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20010 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
20020 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
20030 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20040 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
20050 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
20060 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
20070 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
20080 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
20090 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
200a0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
200b0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
200c0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
200d0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
200e0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
200f0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
20100 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
20110 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
20120 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
20130 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
20140 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
20150 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
20160 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
20170 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
20180 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
20190 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
201a0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
201b0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
201c0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
201d0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
201e0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
201f0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
20200 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
20210 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
20220 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
20230 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
20240 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
20250 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
20260 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
20270 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
20280 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
20290 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
202a0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
202b0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
202c0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
202d0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
202e0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
202f0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
20300 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
20310 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
20320 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
20330 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
20340 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
20350 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
20360 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
20370 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
20380 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
20390 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
203a0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
203b0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
203c0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
203d0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
203e0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
203f0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
20400 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
20410 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
20420 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
20430 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
20440 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
20450 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
20460 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
20470 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
20480 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
20490 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
204a0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
204b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
204c0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
204d0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
204e0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
204f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20500 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
20510 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
20520 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20530 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
20540 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20550 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
20560 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
20570 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
20580 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
20590 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
205a0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
205b0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
205c0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
205d0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
205e0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
205f0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
20600 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
20610 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
20620 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20630 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
20640 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
20650 3e 73 6b 69 70 21 3d 53 51 4c 49 54 45 5f 4f 4b  >skip!=SQLITE_OK
20660 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20670 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20   pCur->skip;.   
20680 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
20690 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
206a0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
206b0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
206c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
206d0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
206e0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
206f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20700 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
20710 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  i]);.    }.    p
20720 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
20730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
20740 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
20750 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49  K!=(rc = getAndI
20760 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
20770 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
20780 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a  ur->apPage[0])).
20790 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75      ){.      pCu
207a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
207b0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
207c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
207d0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
207e0 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ge = 0;..    /* 
207f0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
20800 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
20810 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
20820 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
20830 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78  cursor.    ** ex
20840 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
20850 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
20860 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
20870 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
20880 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65      ** NULL, the
20890 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
208a0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
208b0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
208c0 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20  he case,.    ** 
208d0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
208e0 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
208f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
20900 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
20910 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43  >intKey==1 || pC
20920 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
20930 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  ntKey==0 );.    
20940 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49  if( (pCur->pKeyI
20950 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61  nfo==0)!=pCur->a
20960 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
20970 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20980 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20990 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
209a0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
209b0 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
209c0 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
209d0 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73  t type. This mus
209e0 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61  t be the.  ** ca
209f0 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74  se as the call t
20a00 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
20a10 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20  that loaded the 
20a20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65  root-page (eithe
20a30 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c  r.  ** this call
20a40 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20 69   or a previous i
20a50 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64  nvocation) would
20a60 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
20a70 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20  orruption .  ** 
20a80 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f  if the assumptio
20a90 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
20aa0 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70   and it is not p
20ab0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
20ac0 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65  flags .  ** byte
20ad0 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f   to have been mo
20ae0 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68 69  dified while thi
20af0 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64  s cursor is hold
20b00 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a  ing a reference.
20b10 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
20b20 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20  .  */.  pRoot = 
20b30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
20b40 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
20b50 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
20b60 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65  noRoot );.  asse
20b70 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
20b80 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79  t && (pCur->pKey
20b90 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d  Info==0)==pRoot-
20ba0 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43  >intKey );..  pC
20bb0 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
20bc0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
20bd0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
20be0 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
20bf0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
20c00 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
20c10 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
20c20 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
20c30 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
20c40 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
20c50 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
20c60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20c70 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
20c80 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
20c90 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
20ca0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
20cb0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
20cc0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
20cd0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
20ce0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
20cf0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
20d00 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
20d10 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
20d20 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
20d30 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
20d40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
20d60 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
20d70 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
20d80 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
20d90 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
20da0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
20db0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
20dc0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
20dd0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
20de0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
20df0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
20e00 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
20e10 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
20e20 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
20e30 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
20e40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
20e50 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
20e60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20e70 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
20e80 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
20e90 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20ea0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20eb0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20ec0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20ed0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
20ee0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
20ef0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
20f00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20f10 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
20f20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
20f30 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
20f40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
20f50 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
20f60 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
20f70 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
20f80 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
20f90 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
20fa0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
20fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
20fd0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
20fe0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
20ff0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
21000 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
21010 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
21020 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
21030 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
21040 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
21050 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
21060 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
21070 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
21080 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
21090 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
210a0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
210b0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
210c0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
210d0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
210e0 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
210f0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
21100 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
21110 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
21120 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
21130 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
21140 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
21150 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
21160 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
21170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
21180 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
21190 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
211a0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
211b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
211c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
211d0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
211e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
211f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21200 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21210 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21220 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
21230 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
21240 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
21250 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21260 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
21270 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
21280 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
21290 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
212a0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
212b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
212c0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
212d0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
212e0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
212f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
21300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21310 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
21320 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
21330 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
21340 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
21350 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
21360 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
21370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21380 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
21390 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
213a0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
213b0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
213c0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
213d0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
213e0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
213f0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
21400 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
21410 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
21420 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
21430 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
21440 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21450 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
21460 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
21470 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
21480 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21490 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
214a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
214b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
214c0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
214d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
214e0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
214f0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
21500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21510 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
21520 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
21530 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
21540 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
21550 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
21560 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
21570 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
21580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
215a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
215b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
215c0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
215d0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
215e0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
215f0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
21600 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21610 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
21620 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
21630 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
21640 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
21650 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
21660 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
21670 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
21680 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
21690 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
216a0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
216b0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
216c0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
216d0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
216e0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
216f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
21700 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
21710 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
21720 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21730 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21740 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21750 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
21760 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
21770 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
21780 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
21790 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
217a0 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
217b0 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
217c0 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
217d0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
217e0 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
217f0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
21800 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
21810 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
21820 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
21830 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
21840 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
21850 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
21860 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
21870 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
21880 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
21890 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
218a0 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
218b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
218c0 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
218d0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
218e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
218f0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
21900 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
21910 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21920 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
21930 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
21940 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
21950 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
21960 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
21970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21980 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
21990 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
219a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
219b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
219c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
219d0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
219e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
219f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21a00 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
21a10 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
21a20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
21a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
21a40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21a50 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
21a60 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
21a70 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
21a80 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
21a90 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
21aa0 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
21ab0 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
21ac0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21ad0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
21ae0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
21af0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
21b00 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
21b10 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
21b20 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
21b30 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
21b40 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
21b50 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
21b60 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
21b70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
21b80 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
21b90 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
21ba0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
21bb0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
21bc0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
21bd0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
21be0 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
21bf0 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
21c00 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
21c10 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
21c20 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
21c30 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
21c40 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
21c50 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
21c60 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
21c70 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
21c80 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
21c90 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
21ca0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
21cb0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
21cc0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
21cd0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
21ce0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
21cf0 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
21d00 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
21d10 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
21d20 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
21d30 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
21d40 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
21d50 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
21d60 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
21d70 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
21d80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
21d90 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
21da0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
21db0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
21dc0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
21dd0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
21de0 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
21df0 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
21e00 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
21e10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21e20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
21e30 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
21e40 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
21e50 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
21e60 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
21e70 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
21e80 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
21e90 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
21ec0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
21ed0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
21ee0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
21ef0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
21f00 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
21f10 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
21f20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
21f30 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
21f40 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
21f50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
21f60 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
21f70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
21f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
21f90 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
21fa0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
21fb0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
21fc0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
21fd0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
21fe0 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
21ff0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
22000 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
22010 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
22020 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
22030 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
22040 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
22050 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22070 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
22080 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
22090 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
220a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
220b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
220c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
220d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
220e0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
220f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
22100 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
22110 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
22120 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
22130 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
22140 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
22150 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
22160 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
22170 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
22180 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
22190 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
221a0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
221b0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
221c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
221d0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
221e0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
221f0 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
22200 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
22210 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
22220 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
22230 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
22240 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
22250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22260 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
22270 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
22280 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
22290 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
222a0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
222b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
222c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
222d0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
222e0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
222f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22300 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
22310 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22320 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
22330 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
22340 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
22350 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
22360 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22370 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
22380 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Cell>0 || pCur->
22390 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
223a0 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  NVALID );.  if( 
223b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
223c0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
223d0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
223e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
223f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22400 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
22410 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
22430 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22440 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
22450 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
22460 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
22470 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
22480 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
22490 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
224a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
224b0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
224c0 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50  nt c;..    /* pP
224d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
224e0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
224f0 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
22500 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
22510 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
22520 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
22530 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
22540 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
22550 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
22560 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
22570 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
22580 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
22590 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
225a0 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
225b0 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
225c0 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
225d0 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
225e0 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
225f0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
22600 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
22610 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
22620 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
22630 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
22640 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
22650 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
22660 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
22670 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
22680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
22690 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
226a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
226b0 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
226c0 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
226d0 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
226e0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
226f0 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
22700 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  ){.      pCur->a
22710 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22720 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20  ] = (u16)upr;.  
22730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
22740 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22750 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
22760 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
22770 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
22780 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
22790 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
227a0 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e  r->iPage]; /* In
227b0 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63  dex of current c
227c0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
227d0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
227e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
22800 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
22810 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
22820 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ..      pCur->in
22830 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
22840 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
22850 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
22860 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
22870 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
22880 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
22890 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
228a0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
228b0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
228c0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
228d0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
228e0 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
228f0 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
22900 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
22910 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
22920 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
22930 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
22940 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
22950 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
22960 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
22970 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
22980 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
22990 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
229a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
229b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
229c0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
229d0 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
229e0 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
229f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
22a00 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
22a10 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
22a20 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
22a30 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
22a40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
22a50 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
22a60 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
22a70 69 73 20 33 32 37 36 38 20 62 79 74 65 73 2e 20  is 32768 bytes. 
22a80 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
22a90 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
22aa0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
22ab0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
22ac0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
22ad0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
22ae0 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20 6d 6f  ** page is at mo
22af0 73 74 20 38 31 39 38 20 62 79 74 65 73 2c 20 77  st 8198 bytes, w
22b00 68 69 63 68 20 6d 61 79 20 62 65 20 73 74 6f 72  hich may be stor
22b10 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
22b20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
22b30 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
22b40 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
22b50 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
22b60 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
22b70 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
22b80 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
22b90 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
22ba0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
22bb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
22bc0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
22bd0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
22be0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
22bf0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
22c00 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
22c10 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
22c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22c30 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
22c40 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
22c50 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30  ( !(nCell & 0x80
22c60 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67  ) && nCell<=pPag
22c70 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
22c80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
22c90 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
22ca0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
22cb0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
22cc0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
22cd0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
22ce0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
22cf0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
22d00 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
22d10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
22d20 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
22d30 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
22d40 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22d50 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
22d60 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
22d70 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
22d80 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
22d90 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
22da0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
22db0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
22dc0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
22dd0 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
22de0 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
22df0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
22e00 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
22e10 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
22e20 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
22e30 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
22e40 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
22e50 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
22e60 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
22e70 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
22e80 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22e90 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
22ea0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
22eb0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
22ec0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
22ed0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
22ee0 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
22ef0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
22f00 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
22f10 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
22f20 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
22f30 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
22f40 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
22f50 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
22f60 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
22f70 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
22f80 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
22f90 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
22fa0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
22fb0 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
22fc0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
22fd0 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
22fe0 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
22ff0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
23000 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
23010 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
23020 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
23030 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
23040 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
23050 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
23060 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
23070 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
23080 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
23090 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
230a0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
230b0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
230c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
230d0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
230e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
230f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
23100 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
23110 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
23120 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
23130 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23140 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
23150 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
23160 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
23170 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
23180 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
23190 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
231a0 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
231b0 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
231c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
231d0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
231e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
231f0 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
23200 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
23210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23220 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
23230 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
23240 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
23250 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
23260 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
23270 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
23280 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
23290 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
232a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
232b0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
232c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
232d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
232e0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
232f0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
23300 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
23310 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
23320 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
23330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23340 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
23350 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
23360 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
23370 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
23380 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
23390 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
233a0 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72  = (u16)((lwr+upr
233b0 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
233c0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
233d0 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
233e0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
233f0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
23400 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
23410 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
23420 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
23430 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
23440 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
23450 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
23460 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
23470 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
23480 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
23490 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
234a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
234b0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
234c0 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
234d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
234e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
234f0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
23500 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23510 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
23520 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
23530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23540 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
23550 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
23560 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
23570 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
23580 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70   (u16)lwr;.    p
23590 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
235a0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
235b0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
235c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
235d0 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
235e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
235f0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
23600 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
23610 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
23620 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
23630 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
23640 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
23650 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
23660 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
23670 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
23680 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
23690 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
236a0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
236b0 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
236c0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
236d0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
236e0 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
236f0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
23700 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
23710 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
23720 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
23730 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
23740 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23750 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
23760 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
23770 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
23780 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
23790 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
237a0 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
237b0 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
237c0 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
237d0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
237e0 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
237f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
23800 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
23810 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
23820 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
23830 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
23840 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
23850 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
23860 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
23870 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
23880 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
23890 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
238a0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
238b0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
238c0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
238d0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
238e0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
238f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23900 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
23910 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
23920 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
23930 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
23940 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
23950 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
23960 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
23970 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
23980 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
23990 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
239a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
239b0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
239c0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
239d0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
239e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
239f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23a00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
23a10 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
23a20 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
23a30 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
23a40 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
23a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23a60 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
23a70 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
23a80 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
23a90 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
23aa0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23ab0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
23ac0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
23ad0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
23ae0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23af0 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
23b00 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23b10 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
23b20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
23b30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
23b40 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
23b50 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
23b60 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
23b70 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
23b80 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
23b90 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
23ba0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
23bb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
23bc0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
23bd0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
23be0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
23bf0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
23c00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
23c10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
23c20 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
23c30 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
23c40 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
23c50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23c60 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
23c70 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
23c80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
23c90 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
23ca0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
23cb0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
23cc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
23cd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
23ce0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
23cf0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
23d00 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
23d10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23d20 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
23d30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23d40 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
23d50 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a  ->nCell );.    *
23d60 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  pRes = 0;.    if
23d70 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
23d80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23d90 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
23da0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
23db0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
23dc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23dd0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
23de0 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
23df0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  0;.  if( pPage->
23e00 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
23e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23e20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  }.  rc = moveToL
23e30 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
23e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
23e50 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
23e60 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
23e70 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
23e80 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
23e90 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
23ea0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
23eb0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
23ec0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
23ed0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
23ee0 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
23ef0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
23f00 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
23f10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
23f20 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
23f30 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
23f40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
23f50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
23f60 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
23f70 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
23f80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
23f90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23fa0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23fb0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
23fc0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
23fd0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
23fe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23ff0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24000 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73   }.  pCur->atLas
24010 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52  t = 0;.  if( CUR
24020 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
24030 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
24040 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
24050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24060 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
24070 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20  ->skip<0 ){.    
24080 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
24090 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
240a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
240b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
240c0 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50  >skip = 0;..  pP
240d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
240e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
240f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24100 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
24110 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
24120 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
24130 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24140 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
24150 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
24160 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
24170 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
24180 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
24190 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
241a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
241b0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
241c0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
241d0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
241e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
241f0 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
24200 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
24210 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
24220 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24230 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
24240 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
24250 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
24260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24270 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
24280 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
24290 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
242a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
242b0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
242c0 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43  Key = 0;..    pC
242d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
242e0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
242f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24300 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
24310 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
24320 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
24330 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
24340 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
24350 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
24360 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
24370 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
24380 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
24390 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
243a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
243b0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
243c0 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
243d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
243e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
243f0 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
24400 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
24410 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
24420 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
24430 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
24440 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
24450 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
24460 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
24470 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
24480 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
24490 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
244a0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
244b0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
244c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
244d0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
244e0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
244f0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
24500 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
24510 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
24520 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
24530 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
24540 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
24550 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
24560 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
24570 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
24580 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
24590 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
245a0 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
245b0 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
245c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
245d0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
245e0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
245f0 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
24600 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
24610 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
24620 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
24630 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
24640 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
24650 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
24660 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
24670 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
24680 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
24690 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
246a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
246b0 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
246c0 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
246d0 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
246e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
246f0 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
24700 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
24710 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
24720 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
24730 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
24740 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
24750 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
24760 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
24770 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
24780 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
24790 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
247a0 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
247b0 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
247c0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
247d0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
247e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
247f0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
24800 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
24810 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
24820 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
24830 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
24840 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
24850 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
24860 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
24870 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
24880 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
24890 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
248a0 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
248b0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
248c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
248d0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
248e0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
248f0 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
24900 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
24910 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
24920 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
24930 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24940 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
24950 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
24960 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
24970 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61  1;.  mxPage = pa
24980 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
24990 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
249a0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
249b0 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
249c0 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
249d0 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
249e0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
249f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24a00 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
24a10 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
24a20 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
24a30 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
24a40 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
24a50 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
24a60 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
24a70 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
24a80 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
24a90 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
24aa0 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
24ab0 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
24ac0 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
24ad0 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
24ae0 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
24af0 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
24b00 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
24b10 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
24b20 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
24b30 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
24b40 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
24b50 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
24b60 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
24b70 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
24b80 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
24b90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24ba0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
24bb0 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
24bc0 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
24bd0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
24be0 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
24bf0 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
24c00 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
24c10 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
24c20 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
24c30 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
24c40 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
24c50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
24c60 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
24c70 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
24c80 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
24c90 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
24ca0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
24cb0 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
24cc0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
24cd0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
24ce0 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
24cf0 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
24d00 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
24d10 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
24d20 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
24d30 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
24d40 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
24d50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
24d60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24d70 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
24d80 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
24d90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
24da0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
24db0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
24dc0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
24dd0 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
24de0 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
24df0 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
24e00 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
24e10 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
24e20 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
24e30 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
24e40 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
24e50 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
24e60 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
24e70 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
24e80 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
24e90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
24ea0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
24eb0 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
24ec0 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
24ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
24ee0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
24ef0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
24f00 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
24f10 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
24f20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
24f30 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
24f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24f50 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
24f60 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
24f70 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
24f80 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
24f90 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
24fa0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
24fb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
24fc0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
24fd0 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
24fe0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
24ff0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
25000 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
25010 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
25020 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25030 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  page;.      }.. 
25040 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
25050 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
25060 5b 34 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74  [4]);.      test
25070 63 61 73 65 28 20 6b 3d 3d 28 75 33 32 29 28 70  case( k==(u32)(p
25080 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
25090 20 2d 20 32 29 20 29 3b 0a 20 20 20 20 20 20 69   - 2) );.      i
250a0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
250b0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
250c0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
250d0 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
250e0 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
250f0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
25100 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
25110 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
25120 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
25130 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
25140 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
25150 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
25160 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
25170 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
25180 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
25190 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
251a0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
251b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
251c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
251d0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
251e0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
251f0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
25200 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
25210 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
25220 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
25230 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
25240 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
25250 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
25260 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
25270 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
25280 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
25290 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
252a0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
252b0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
252c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
252d0 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
252e0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
252f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
25300 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
25310 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
25320 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
25330 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25340 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25350 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
25360 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
25370 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
25380 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
25390 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
253a0 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
253b0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
253c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
253d0 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
253e0 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
253f0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
25400 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
25410 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
25420 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
25430 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
25440 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
25450 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25460 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
25470 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
25480 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
25490 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
254a0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
254b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
254c0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
254d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
254e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
254f0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
25500 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
25510 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
25520 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25530 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
25540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25550 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
25560 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
25570 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
25580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
25590 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
255a0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
255b0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
255c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
255d0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
255e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
255f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25600 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
25610 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
25620 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
25630 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
25640 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
25650 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
25660 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
25670 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
25680 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
25690 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
256a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
256b0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
256c0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
256d0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
256e0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
256f0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
25700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25710 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
25720 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
25730 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
25740 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
25750 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25760 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25770 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25780 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25790 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
257a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
257b0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
257c0 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
257d0 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
257e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
257f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25800 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25810 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
25820 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
25830 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
25840 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25850 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
25860 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
25870 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25880 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
25890 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
258a0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
258b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
258c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
258d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
258e0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
258f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
25900 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
25910 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
25920 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
25930 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
25940 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
25950 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
25960 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
25970 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
25980 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
25990 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
259a0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
259b0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
259c0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
259d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
259e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
259f0 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
25a00 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
25a10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
25a20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
25a30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
25a40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
25a50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
25a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25a70 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
25a80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
25a90 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
25ab0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25ac0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
25ad0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
25ae0 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
25af0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
25b00 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
25b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25b20 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
25b30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
25b40 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
25b50 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
25b60 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
25b70 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
25b80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
25b90 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
25ba0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
25bb0 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
25bc0 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
25bd0 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
25be0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
25bf0 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
25c00 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
25c10 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
25c20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
25c30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25c40 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
25c50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
25c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
25c70 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25c80 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
25c90 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
25ca0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
25cb0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
25cc0 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
25cd0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
25ce0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
25cf0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
25d00 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
25d10 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
25d20 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
25d30 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
25d40 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
25d50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
25d60 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
25d70 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
25d80 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
25d90 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
25da0 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
25db0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
25dc0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
25dd0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
25de0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
25df0 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
25e00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25e20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25e30 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
25e40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
25e50 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
25e60 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
25e70 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
25e80 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
25e90 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
25ea0 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
25eb0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
25ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
25ed0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
25ee0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
25ef0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
25f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
25f10 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
25f20 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
25f30 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
25f40 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
25f50 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
25f60 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
25f70 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
25f80 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
25f90 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
25fa0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
25fb0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
25fc0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
25fd0 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
25fe0 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
25ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26000 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
26010 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
26020 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
26030 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
26040 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
26050 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
26060 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
26070 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
26080 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
26090 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
260a0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
260b0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -1);.          a
260c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
260d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
260e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20  Trunk->pDbPage) 
260f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
26100 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
26110 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
26120 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20  , *pPgno);.     
26130 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
26140 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
26150 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
26160 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
26170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26190 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
261a0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
261b0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
261c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
261d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
261f0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
26200 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26210 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
26220 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
26230 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
26240 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
26250 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
26260 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
26270 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
26280 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
26290 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
262a0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
262b0 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
262c0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
262d0 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
262e0 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
262f0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
26300 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
26310 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
26320 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67  t(pBt);.    *pPg
26330 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a  no = nPage + 1;.
26340 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d  .    if( *pPgno=
26350 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
26360 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
26370 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
26380 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
26390 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
263a0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
263b0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
263c0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
263d0 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20   *pPgno) ){.    
263e0 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
263f0 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
26400 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
26410 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
26420 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
26430 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
26440 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
26450 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
26460 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
26470 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
26480 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
26490 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
264a0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
264b0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
264c0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
264d0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
264e0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
264f0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
26500 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
26510 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
26520 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
26530 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
26540 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
26550 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
26560 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
26570 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c  t, *pPgno, &pPg,
26580 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
26590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
265a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
265b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
265c0 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
265d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
265e0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
265f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
26600 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26610 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
26620 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
26630 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
26640 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29  pBt) ){ (*pPgno)
26650 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
26660 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
26670 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
26680 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
26690 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
266a0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
266b0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
266c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
266d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
266e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
266f0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
26700 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
26710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26720 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
26730 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
26740 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
26750 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
26760 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
26770 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
26780 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
26790 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
267a0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
267b0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
267c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
267d0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
267e0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
267f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
26800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
26810 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
26820 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
26830 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
26840 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
26850 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
26860 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26870 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
26890 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
268a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
268b0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
268c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
268d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
268e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
268f0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
26900 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
26910 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
26920 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
26930 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
26940 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
26950 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
26960 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
26970 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
26980 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
26990 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
269a0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
269b0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
269c0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
269d0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
269e0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
269f0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
26a00 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
26a10 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
26a20 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
26a30 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
26a40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
26a50 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
26a60 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
26a70 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
26a80 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
26a90 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
26aa0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
26ab0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
26ac0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
26ad0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
26ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
26af0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
26b00 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
26b10 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
26b20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
26b30 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b50 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
26b60 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
26b70 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b90 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
26ba0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
26bb0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
26bc0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
26bd0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
26be0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
26bf0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
26c00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26c20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
26c30 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
26c40 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
26c50 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
26c80 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
26cb0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
26cc0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
26cd0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
26ce0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26cf0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
26d00 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
26d10 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
26d20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
26d30 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
26d40 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
26d50 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
26d60 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
26d70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
26d80 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
26d90 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
26da0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
26db0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
26dc0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
26dd0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
26de0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
26df0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
26e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26e10 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
26e20 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
26e30 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26e40 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
26e50 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26e60 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
26e70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26e80 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
26e90 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
26ea0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
26eb0 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
26ec0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
26ed0 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
26ee0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
26ef0 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
26f00 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
26f10 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
26f20 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
26f30 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  os..  */.  if( (
26f40 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20  !pPage && (rc = 
26f50 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
26f60 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
26f70 20 30 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20   0))).   ||     
26f80 20 20 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c         (rc = sql
26f90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26fa0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a  Page->pDbPage)).
26fb0 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72    ){.    goto fr
26fc0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
26fd0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
26fe0 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
26ff0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
27000 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
27010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
27020 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
27030 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
27040 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
27050 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
27060 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
27070 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
27080 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
27090 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20  ACUUM ){.    rc 
270a0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
270b0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
270c0 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  REEPAGE, 0);.   
270d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
270e0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
270f0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
27100 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
27110 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
27120 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
27130 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
27140 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
27150 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
27160 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
27170 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
27180 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
27190 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
271a0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
271b0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
271c0 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
271d0 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
271e0 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
271f0 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
27200 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
27210 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
27220 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
27230 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
27240 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
27250 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
27260 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
27270 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
27280 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
27290 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
272a0 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
272b0 69 6e 74 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  int nLeaf;      
272c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
272d0 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
272e0 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
272f0 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
27300 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
27310 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
27320 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
27330 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27340 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
27350 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
27360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27370 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
27380 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
27390 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
273a0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
273b0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
273c0 20 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20   nLeaf<0 ){.    
273d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
273e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
273f0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
27400 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
27410 66 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73  f( nLeaf<pBt->us
27420 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
27430 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
27440 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
27450 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
27460 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
27470 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
27480 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
27490 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
274a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
274b0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
274c0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
274d0 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
274e0 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
274f0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
27500 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
27510 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
27520 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
27530 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
27540 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
27550 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
27560 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
27570 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
27580 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
27590 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
275a0 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
275b0 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
275c0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
275d0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
275e0 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
275f0 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
27600 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
27610 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
27620 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
27630 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
27640 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
27650 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
27660 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
27670 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72  contain to restr
27680 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
27690 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
276a0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
276b0 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
276c0 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
276d0 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
276e0 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
276f0 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
27700 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
27710 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
27720 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
27730 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
27740 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
27750 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
27760 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
27770 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
27780 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  8"..      */.   
27790 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
277a0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
277b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
277c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
277d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
277e0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
277f0 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
27800 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
27810 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
27820 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
27830 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66   iPage);.#ifndef
27840 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
27850 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 69 66  ELETE.        if
27860 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
27870 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
27880 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
27890 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
278a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
278b0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
278c0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
278d0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
278e0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
278f0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
27900 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
27910 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
27920 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
27930 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
27940 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
27950 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
27960 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
27970 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
27980 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
27990 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
279a0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
279b0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
279c0 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
279d0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
279e0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
279f0 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
27a00 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
27a10 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
27a20 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
27a30 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
27a40 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
27a50 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
27a60 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
27a70 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
27a80 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
27a90 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
27aa0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
27ab0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
27ac0 2f 0a 20 20 69 66 28 20 20 20 28 28 21 70 50 61  /.  if(   ((!pPa
27ad0 67 65 29 20 26 26 20 28 30 20 21 3d 20 28 72 63  ge) && (0 != (rc
27ae0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
27af0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
27b00 67 65 2c 20 30 29 29 29 29 0a 20 20 20 20 20 7c  ge, 0)))).     |
27b10 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
27b20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27b30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
27b40 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ).  ){.    goto 
27b50 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
27b60 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
27b70 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
27b80 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
27b90 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
27ba0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
27bb0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
27bc0 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
27bd0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
27be0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
27bf0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
27c00 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
27c10 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
27c20 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
27c30 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
27c40 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
27c50 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
27c60 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
27c70 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
27c80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27c90 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
27ca0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
27cb0 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 72  ge){.  return fr
27cc0 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
27cd0 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
27ce0 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
27cf0 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
27d00 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
27d10 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
27d20 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
27d30 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
27d40 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
27d50 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
27d60 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
27d70 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
27d80 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
27d90 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
27da0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
27db0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
27dc0 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65 53 69    u16 ovflPageSi
27dd0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
27de0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27df0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
27e00 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
27e10 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
27e20 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
27e30 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
27e40 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
27e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27e60 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
27e70 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
27e80 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
27e90 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
27ea0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
27eb0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
27ec0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
27ed0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
27ee0 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
27ef0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
27f00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
27f10 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
27f20 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
27f30 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
27f40 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
27f50 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
27f60 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
27f70 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
27f80 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
27f90 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
27fa0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
27fb0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
27fc0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
27fd0 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
27fe0 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
27ff0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
28000 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
28010 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
28020 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
28030 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
28040 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
28050 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
28060 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
28070 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
28080 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
28090 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
280a0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
280b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
280c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
280d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
280e0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
280f0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
28100 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
28110 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
28120 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
28130 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28140 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  }.    rc = freeP
28150 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
28160 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
28170 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
28180 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
28190 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
281a0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
281b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
281c0 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
281d0 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
281e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
281f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
28200 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
28210 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
28220 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
28230 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
28240 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
28250 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
28260 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
28270 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
28280 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
28290 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
282a0 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
282b0 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
282c0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
282d0 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
282e0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
282f0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
28300 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
28310 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
28320 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
28330 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
28340 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28350 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
28360 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
28370 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
28380 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
28390 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
283a0 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
283b0 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
283c0 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
283d0 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
283e0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
283f0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
28400 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
28410 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
28440 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
28450 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
28460 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
28470 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
28480 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
28490 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
284a0 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
284b0 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
284c0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
284d0 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
284e0 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
284f0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
28500 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
28510 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
28520 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
28530 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
28540 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
28570 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
28580 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
28590 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
285a0 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
285b0 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
285c0 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
285d0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
285e0 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
285f0 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
28600 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
28610 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
28620 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
28630 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
28640 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
28650 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
28660 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43  int nHeader;.  C
28670 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
28680 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28690 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
286a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
286b0 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
286c0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
286d0 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65   writeable since
286e0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20   pCell might be 
286f0 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62  auxiliary.  ** b
28700 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74  uffer space that
28710 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f   is separate fro
28720 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66  m the pPage buff
28730 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73  er area */.  ass
28740 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65  ert( pCell<pPage
28750 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c  ->aData || pCell
28760 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
28770 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
28780 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
28790 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
287a0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
287b0 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
287c0 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
287d0 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
287e0 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
287f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
28800 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
28810 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
28820 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
28830 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
28840 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
28850 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
28860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
28870 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
28880 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
28890 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
288a0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
288b0 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74  64*)&nKey);.  bt
288c0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
288d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
288e0 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
288f0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48  info.nHeader==nH
28900 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72  eader );.  asser
28910 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
28920 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
28930 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32  info.nData==(u32
28940 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29  )(nData+nZero) )
28950 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
28960 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
28970 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
28980 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
28990 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
289a0 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
289b0 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
289c0 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
289d0 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20  a = 0;.  }else{ 
289e0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e  .    if( NEVER(n
289f0 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c  Key>0x7fffffff |
28a00 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20  | pKey==0) ){.  
28a10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28a20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28a30 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
28a40 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  ad += (int)nKey;
28a50 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
28a60 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e  ;.    nSrc = (in
28a70 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  t)nKey;.  }.  *p
28a80 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
28a90 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
28aa0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
28ab0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
28ac0 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
28ad0 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
28ae0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
28af0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
28b00 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
28b10 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
28b20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28b30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
28b40 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
28b50 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
28b60 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
28b70 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
28b80 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
28b90 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
28ba0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
28bb0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
28bc0 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
28bd0 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
28be0 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
28bf0 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
28c00 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
28c10 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
28c20 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
28c30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
28c40 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
28c50 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
28c60 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
28c70 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
28c80 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
28c90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28ca0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
28cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
28cc0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
28cd0 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
28ce0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
28cf0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
28d00 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
28d10 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
28d20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
28d30 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
28d40 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
28d50 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
28d60 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
28d70 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
28d80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
28d90 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
28da0 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
28db0 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
28dc0 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
28dd0 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
28de0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
28df0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
28e00 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
28e10 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
28e20 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
28e30 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
28e40 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
28e50 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
28e60 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
28e70 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
28e80 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
28e90 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
28ea0 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
28eb0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
28ec0 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
28ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28ee0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
28ef0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
28f00 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
28f10 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
28f20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
28f30 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
28f40 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
28f50 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
28f60 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
28f70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28f80 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
28f90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
28fa0 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
28fb0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
28fc0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
28fd0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
28fe0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
28ff0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
29000 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
29010 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
29020 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
29030 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
29040 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
29050 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
29060 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
29070 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
29080 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
29090 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
290a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
290b0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
290c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
290d0 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
290e0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
290f0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
29100 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
29110 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
29120 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
29130 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
29140 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
29150 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
29160 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
29170 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
29180 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
29190 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
291a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
291b0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
291c0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
291d0 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
291e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
291f0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
29200 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
29210 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
29220 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
29230 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
29240 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
29250 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
29260 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
29270 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
29280 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
29290 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
292a0 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
292b0 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
292c0 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
292d0 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
292e0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
292f0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
29300 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
29310 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
29320 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
29330 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
29340 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
29350 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
29360 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29370 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
29380 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29390 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
293a0 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
293b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
293c0 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
293d0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
293e0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
293f0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
29400 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
29410 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
29420 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
29430 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
29440 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
29450 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
29460 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
29470 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
29480 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
29490 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
294a0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
294b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
294c0 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
294d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
294e0 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
294f0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
29500 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
29510 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
29520 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
29530 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
29540 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
29550 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
29560 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
29570 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
29580 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
29590 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b    if( nSrc==0 ){
295a0 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  .      nSrc = nD
295b0 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20  ata;.      pSrc 
295c0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
295d0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
295e0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
295f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
29610 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
29620 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
29630 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
29640 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
29650 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
29660 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
29670 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
29680 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
29690 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
296a0 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
296b0 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
296c0 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
296d0 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
296e0 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
296f0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
29700 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
29710 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
29720 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
29730 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
29740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f  /.static int dro
29750 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
29760 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
29770 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  nt sz){.  int i;
29780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
29790 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
297a0 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  nt pc;         /
297b0 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
297c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
297d0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
297e0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
297f0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
29800 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
29810 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
29820 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
29830 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
29840 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
29850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29860 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  return code */..
29870 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
29880 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
29890 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
298a0 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
298b0 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
298c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
298d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
298e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
298f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
29900 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
29910 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
29920 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
29930 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
29940 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
29950 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
29960 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
29970 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69  t2byte(ptr);.  i
29980 66 28 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64  f( (pc<pPage->hd
29990 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65  rOffset+6+(pPage
299a0 2d 3e 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20  ->leaf?0:4)).   
299b0 20 20 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67    || (pc+sz>pPag
299c0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
299d0 7a 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ze) ){.    retur
299e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
299f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
29a00 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
29a10 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
29a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29a30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
29a40 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64  ;.  }.  for(i=id
29a50 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
29a60 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
29a70 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
29a80 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
29a90 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
29aa0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
29ab0 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
29ac0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
29ad0 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
29ae0 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
29af0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72  >nFree += 2;.  r
29b00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
29b20 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
29b30 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
29b40 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
29b50 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
29b60 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
29b70 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
29b80 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
29b90 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
29ba0 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
29bb0 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
29bc0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
29bd0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
29be0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
29bf0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
29c00 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
29c10 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
29c20 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
29c30 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
29c40 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
29c50 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  >aOvfl[] and mak
29c60 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
29c70 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
29c80 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
29c90 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
29ca0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
29cb0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
29cc0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
29cd0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
29ce0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
29cf0 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
29d00 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
29d10 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
29d20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
29d30 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
29d40 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
29d50 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
29d60 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
29d70 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
29d80 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
29d90 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
29da0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
29db0 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
29dc0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
29dd0 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
29de0 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
29df0 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
29e00 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
29e10 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
29e20 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
29e30 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65  tic int insertCe
29e40 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
29e50 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
29e60 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
29e70 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
29e80 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
29e90 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
29ea0 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
29eb0 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
29ec0 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
29ed0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
29ee0 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
29ef0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
29f00 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
29f10 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
29f20 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
29f30 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
29f40 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
29f50 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
29f60 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f  needed */.  Pgno
29f70 20 69 43 68 69 6c 64 20 20 20 20 20 20 20 2f 2a   iChild       /*
29f80 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65   If non-zero, re
29f90 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79  place first 4 by
29fa0 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61  tes with this va
29fb0 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lue */.){.  int 
29fc0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
29fd0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
29fe0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
29ff0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2a000 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2a010 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2a020 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
2a030 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2a040 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
2a050 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
2a060 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2a070 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
2a080 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
2a090 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
2a0a0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
2a0b0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
2a0c0 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
2a0d0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
2a0e0 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
2a0f0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2a100 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2a110 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
2a120 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
2a130 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
2a140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2a150 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
2a160 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
2a170 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
2a180 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68  int nSkip = (iCh
2a190 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20  ild ? 4 : 0);.. 
2a1a0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
2a1b0 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
2a1c0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
2a1d0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
2a1e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
2a1f0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2a200 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2a210 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
2a220 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a230 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
2a240 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f  aySize(pPage->aO
2a250 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2a260 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
2a270 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
2a280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2a290 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a2a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2a2b0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
2a2c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
2a2d0 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
2a2e0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
2a2f0 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
2a300 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
2a310 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
2a320 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
2a330 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
2a340 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
2a350 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2a360 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
2a370 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
2a380 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2a390 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
2a3a0 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
2a3b0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
2a3c0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
2a3d0 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
2a3e0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
2a3f0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
2a400 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
2a410 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a  ].idx = (u16)i;.
2a420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
2a430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a440 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2a450 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2a460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a470 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2a480 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
2a490 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2a4a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2a4b0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2a4c0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
2a4d0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
2a4e0 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
2a4f0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
2a500 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
2a510 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2a520 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
2a530 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
2a540 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2a550 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
2a560 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
2a570 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a580 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2a590 3e 3d 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 69  >=end+2 );.    i
2a5a0 66 28 20 69 64 78 2b 73 7a 20 3e 20 70 50 61 67  f( idx+sz > pPag
2a5b0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2a5c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
2a5d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a5e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2a5f0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
2a600 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
2a610 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20  ee -= (u16)(2 + 
2a620 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  sz);.    memcpy(
2a630 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d  &data[idx+nSkip]
2a640 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2a650 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66  z-nSkip);.    if
2a660 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
2a670 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
2a680 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
2a690 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d      }.    for(j=
2a6a0 65 6e 64 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a  end, ptr=&data[j
2a6b0 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20  ]; j>ins; j-=2, 
2a6c0 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70  ptr-=2){.      p
2a6d0 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b  tr[0] = ptr[-2];
2a6e0 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  .      ptr[1] = 
2a6f0 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[-1];.    }. 
2a700 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
2a710 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
2a720 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2a730 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2a740 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
2a750 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
2a760 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2a770 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2a780 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
2a790 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
2a7a0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
2a7b0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
2a7c0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2a7d0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
2a7e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2a7f0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
2a800 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
2a810 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
2a820 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
2a830 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76  turn ptrmapPutOv
2a840 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
2a850 6c 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ll);.    }.#endi
2a860 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  f.  }..  return 
2a870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2a880 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f  .** Add a list o
2a890 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67  f cells to a pag
2a8a0 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f  e.  The page sho
2a8b0 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79  uld be initially
2a8c0 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63   empty..** The c
2a8d0 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74  ells are guarant
2a8e0 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  eed to fit on th
2a8f0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
2a900 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50  c void assembleP
2a910 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
2a920 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20  pPage,   /* The 
2a930 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d  page to be assem
2a940 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  blied */.  int n
2a950 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
2a960 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  The number of ce
2a970 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68  lls to add to th
2a980 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  is page */.  u8 
2a990 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f  **apCell,      /
2a9a0 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65  * Pointers to ce
2a9b0 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75  ll bodies */.  u
2a9c0 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20  16 *aSize       
2a9d0 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65   /* Sizes of the
2a9e0 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69   cells */.){.  i
2a9f0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2aa00 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2aa10 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   */.  u8 *pCellp
2aa20 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  tr;     /* Addre
2aa30 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
2aa40 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
2aa50 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f   cellbody;     /
2aa60 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
2aa70 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20  t cell body */. 
2aa80 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
2aa90 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aab0 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  Pointer to data 
2aac0 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63  for pPage */.  c
2aad0 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
2aae0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2aaf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2ab00 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f  fset of header o
2ab10 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  n pPage */.  con
2ab20 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d  st int nUsable =
2ab30 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2ab40 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62  bleSize; /* Usab
2ab50 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20  le size of page 
2ab60 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
2ab70 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2ab80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2ab90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2aba0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2abb0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2abc0 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43  ( nCell>=0 && nC
2abd0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
2abe0 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
2abf0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
2ac00 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72  =5460 );.  asser
2ac10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2ac20 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2ac30 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2ac40 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2ac50 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74  he page has just
2ac60 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20   been zeroed by 
2ac70 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20  zeroPage() */.  
2ac80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ac90 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
2aca0 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64  ert( get2byte(&d
2acb0 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
2acc0 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
2acd0 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
2ace0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
2acf0 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c  nCell*2];.  cell
2ad00 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a  body = nUsable;.
2ad10 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b    for(i=nCell-1;
2ad20 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2ad30 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a   pCellptr -= 2;.
2ad40 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20      cellbody -= 
2ad50 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75  aSize[i];.    pu
2ad60 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
2ad70 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
2ad80 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
2ad90 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
2ada0 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20  ], aSize[i]);.  
2adb0 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
2adc0 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
2add0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
2ade0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c  ata[hdr+5], cell
2adf0 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
2ae00 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a  nFree -= (nCell*
2ae10 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65  2 + nUsable - ce
2ae20 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2ae30 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
2ae40 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
2ae50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
2ae60 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
2ae70 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
2ae80 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
2ae90 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
2aea0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2aeb0 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
2aec0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
2aed0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2aee0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
2aef0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2af00 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
2af10 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2af20 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
2af30 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2af40 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
2af50 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
2af60 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
2af70 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
2af80 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2af90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
2afa0 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
2afb0 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
2afc0 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
2afd0 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
2afe0 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
2aff0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
2b000 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
2b010 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
2b020 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
2b030 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
2b040 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
2b050 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
2b060 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
2b070 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
2b080 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
2b090 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
2b0a0 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
2b0b0 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
2b0c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2b0d0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2b0e0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2b0f0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
2b100 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
2b110 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
2b120 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
2b130 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69   balance */...#i
2b140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b150 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
2b160 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
2b170 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
2b180 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
2b190 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
2b1a0 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
2b1b0 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
2b1c0 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
2b1d0 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
2b1e0 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
2b1f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
2b200 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
2b210 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
2b220 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
2b230 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
2b240 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
2b250 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20   trying balance 
2b260 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
2b270 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
2b280 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
2b290 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
2b2a0 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
2b2b0 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
2b2c0 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
2b2d0 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
2b2e0 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
2b2f0 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
2b300 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
2b310 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
2b320 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
2b330 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
2b340 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
2b350 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
2b360 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
2b370 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
2b380 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
2b390 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
2b3a0 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
2b3b0 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
2b3c0 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
2b3d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
2b3e0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
2b3f0 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
2b400 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
2b410 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
2b420 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
2b430 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
2b440 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
2b450 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
2b460 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53  ge..**.** The pS
2b470 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75  pace buffer is u
2b480 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74  sed to store a t
2b490 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66  emporary copy of
2b4a0 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20   the divider.** 
2b4b0 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62  cell that will b
2b4c0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2b4d0 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20  pParent. Such a 
2b4e0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
2b4f0 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67   a 4.** byte pag
2b500 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65  e number followe
2b510 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
2b520 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
2b530 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
2b540 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79  s, at most 13 by
2b550 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70  tes. Hence the p
2b560 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73  Space buffer mus
2b570 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74  t be at.** least
2b580 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
2b590 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2b5a0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
2b5b0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2b5c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2b5d0 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20   u8 *pSpace){.  
2b5e0 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20  BtShared *const 
2b5f0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2b600 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44  ;    /* B-Tree D
2b610 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d  atabase */.  Mem
2b620 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Page *pNew;     
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b640 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
2b650 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ated page */.  i
2b660 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b680 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2b690 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  de */.  Pgno pgn
2b6a0 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  oNew;           
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b6c0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
2b6d0 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  New */..  assert
2b6e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b6f0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2b700 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2b710 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2b720 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2b730 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2b740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2b750 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
2b760 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  );..  if( pPage-
2b770 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75  >nCell<=0 ) retu
2b780 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2b790 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
2b7a0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2b7b0 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
2b7c0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
2b7d0 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
2b7e0 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
2b7f0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2b800 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
2b810 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
2b820 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
2b830 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
2b840 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
2b850 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
2b860 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
2b870 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
2b880 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2b890 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
2b8a0 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
2b8b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b8c0 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
2b8d0 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
2b8e0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
2b8f0 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  age->aOvfl[0].pC
2b900 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  ell;.    u16 szC
2b910 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
2b920 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
2b930 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
2b940 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2b950 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2b960 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
2b970 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
2b980 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
2b990 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
2b9a0 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
2b9b0 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
2b9c0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
2b9d0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2b9e0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
2b9f0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2ba00 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
2ba10 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
2ba20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2ba30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2ba40 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2ba50 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
2ba60 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
2ba70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
2ba80 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
2ba90 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
2baa0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
2bab0 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
2bac0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
2bad0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
2bae0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
2baf0 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
2bb00 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
2bb10 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
2bb20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
2bb30 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
2bb40 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
2bb50 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
2bb60 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
2bb70 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
2bb80 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
2bb90 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
2bba0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
2bbb0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2bbc0 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
2bbd0 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
2bbe0 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
2bbf0 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
2bc00 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
2bc10 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2bc20 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
2bc30 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2bc40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2bc50 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2bc60 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
2bc70 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
2bc80 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  o);.      if( sz
2bc90 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
2bca0 63 61 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  cal && rc==SQLIT
2bcb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bcc0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
2bcd0 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
2bce0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
2bcf0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
2bd00 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
2bd10 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
2bd20 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
2bd30 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
2bd40 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2bd50 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
2bd60 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
2bd70 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
2bd80 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
2bd90 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
2bda0 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
2bdb0 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
2bdc0 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
2bdd0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
2bde0 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
2bdf0 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
2be00 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
2be10 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
2be20 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
2be30 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
2be40 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
2be50 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
2be60 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
2be70 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
2be80 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
2be90 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2bea0 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
2beb0 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
2bec0 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
2bed0 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
2bee0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2bef0 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
2bf00 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
2bf10 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
2bf20 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
2bf30 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
2bf40 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
2bf50 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
2bf60 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
2bf70 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
2bf80 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
2bf90 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
2bfa0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2bfb0 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
2bfc0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
2bfd0 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
2bfe0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2bff0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
2c000 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2c010 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2c020 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
2c030 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2c040 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
2c050 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2c060 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
2c070 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
2c080 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
2c090 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
2c0a0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
2c0b0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
2c0c0 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
2c0d0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
2c0e0 50 61 72 65 6e 74 2c 70 50 61 72 65 6e 74 2d 3e  Parent,pParent->
2c0f0 6e 43 65 6c 6c 2c 70 53 70 61 63 65 2c 28 69 6e  nCell,pSpace,(in
2c100 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c  t)(pOut-pSpace),
2c110 30 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  0,pPage->pgno);.
2c120 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
2c130 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
2c140 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ter of pParent t
2c150 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
2c160 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
2c170 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
2c180 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2c190 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2c1a0 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
2c1b0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
2c1c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2c1d0 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
2c1e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2c1f0 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
2c200 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
2c210 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
2c220 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
2c230 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73  #if 0./*.** This
2c240 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2c250 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e  ot contribute an
2c260 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70  ything to the op
2c270 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74  eration of SQLit
2c280 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  e..** it is some
2c290 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20  times activated 
2c2a0 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c  temporarily whil
2c2b0 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65  e debugging code
2c2c0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a   responsible .**
2c2d0 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69   for setting poi
2c2e0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2c2f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c300 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
2c310 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67  (MemPage **apPag
2c320 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  e, int nPage){. 
2c330 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
2c340 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69  (i=0; i<nPage; i
2c350 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b  ++){.    Pgno n;
2c360 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d  .    u8 e;.    M
2c370 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2c380 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42  apPage[i];.    B
2c390 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2c3a0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61  Page->pBt;.    a
2c3b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2c3c0 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72  Init );..    for
2c3d0 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e  (j=0; j<pPage->n
2c3e0 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Cell; j++){.    
2c3f0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2c400 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20  .      u8 *z;.  
2c410 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69     .      z = fi
2c420 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29  ndCell(pPage, j)
2c430 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
2c440 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2c450 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20   z, &info);.    
2c460 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
2c470 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
2c480 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
2c490 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76  byte(&z[info.iOv
2c4a0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
2c4b0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2c4c0 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a   ovfl, &e, &n);.
2c4d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c4e0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2c4f0 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  & e==PTRMAP_OVER
2c500 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d  FLOW1 );.      }
2c510 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
2c520 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2c530 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
2c540 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20  get4byte(z);.   
2c550 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2c560 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
2c570 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
2c580 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2c590 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2c5a0 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d  BTREE );.      }
2c5b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
2c5c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c5d0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2c5e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2c5f0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2c600 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2c610 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2c620 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
2c630 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
2c640 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2c650 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
2c660 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  REE );.    }.  }
2c670 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2c680 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
2c690 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2c6a0 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  ed to copy the c
2c6b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
2c6c0 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65  -tree node store
2c6d0 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46  d .** on page pF
2c6e0 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2c6f0 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77   If page pFrom w
2c700 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61  as not a leaf pa
2c710 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ge, then.** the 
2c720 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2c730 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69  ies for each chi
2c740 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61  ld page are upda
2c750 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a  ted so that the.
2c760 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  ** parent page s
2c770 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69  tored in the poi
2c780 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65  nter map is page
2c790 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63   pTo. If pFrom c
2c7a0 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20  ontained.** any 
2c7b0 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66  cells with overf
2c7c0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
2c7d0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72  s, then the corr
2c7e0 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65  esponding pointe
2c7f0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
2c800 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65   are also update
2c810 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  d so that the pa
2c820 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67  rent page is pag
2c830 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e pTo..**.** If 
2c840 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74  pFrom is current
2c850 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20  ly carrying any 
2c860 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28  overflow cells (
2c870 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a  entries in the.*
2c880 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b  * MemPage.aOvfl[
2c890 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61  ] array), they a
2c8a0 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f  re not copied to
2c8b0 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66   pTo. .**.** Bef
2c8c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70  ore returning, p
2c8d0 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69  age pTo is reini
2c8e0 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62  tialized using b
2c8f0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
2c900 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72  **.** The perfor
2c910 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75  mance of this fu
2c920 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72  nction is not cr
2c930 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e  itical. It is on
2c940 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ly used by .** t
2c950 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  he balance_shall
2c960 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e  ower() and balan
2c970 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63  ce_deeper() proc
2c980 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20  edures, neither 
2c990 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20  of.** which are 
2c9a0 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64  called often und
2c9b0 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d  er normal circum
2c9c0 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  stances..*/.stat
2c9d0 69 63 20 69 6e 74 20 63 6f 70 79 4e 6f 64 65 43  ic int copyNodeC
2c9e0 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
2c9f0 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
2ca00 70 54 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64  pTo){.  BtShared
2ca10 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70   * const pBt = p
2ca20 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 75 38 20  From->pBt;.  u8 
2ca30 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20  * const aFrom = 
2ca40 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20  pFrom->aData;.  
2ca50 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d  u8 * const aTo =
2ca60 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pTo->aData;.  i
2ca70 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64  nt const iFromHd
2ca80 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66  r = pFrom->hdrOf
2ca90 66 73 65 74 3b 0a 20 20 69 6e 74 20 63 6f 6e 73  fset;.  int cons
2caa0 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f  t iToHdr = ((pTo
2cab0 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30  ->pgno==1) ? 100
2cac0 20 3a 20 30 29 3b 0a 20 20 69 6e 74 20 72 63 20   : 0);.  int rc 
2cad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2cae0 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 61 73 73  nt iData;..  ass
2caf0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e  ert( pFrom->isIn
2cb00 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2cb10 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
2cb20 6f 48 64 72 20 29 3b 0a 20 20 61 73 73 65 72 74  oHdr );.  assert
2cb30 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  ( get2byte(&aFro
2cb40 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d  m[iFromHdr+5])<=
2cb50 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2cb60 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68  );..  /* Copy th
2cb70 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
2cb80 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
2cb90 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
2cba0 6f 2e 20 2a 2f 0a 20 20 69 44 61 74 61 20 3d 20  o. */.  iData = 
2cbb0 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
2cbc0 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20  iFromHdr+5]);.  
2cbd0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74  memcpy(&aTo[iDat
2cbe0 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61  a], &aFrom[iData
2cbf0 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
2cc00 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 6d 65 6d  ze-iData);.  mem
2cc10 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
2cc20 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
2cc30 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
2cc40 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
2cc50 3e 6e 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 52  >nCell);..  /* R
2cc60 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2cc70 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65   pTo so that the
2cc80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2cc90 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
2cca0 72 65 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68  re.  ** match th
2ccb0 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20  e new data. The 
2ccc0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
2ccd0 66 20 70 54 6f 20 22 63 61 6e 6e 6f 74 22 20 66  f pTo "cannot" f
2cce0 61 69 6c 2c 20 61 73 20 74 68 65 0a 20 20 2a 2a  ail, as the.  **
2ccf0 20 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f   data copied fro
2cd00 6d 20 70 46 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e  m pFrom is known
2cd10 20 74 6f 20 62 65 20 76 61 6c 69 64 2e 20 20 2a   to be valid.  *
2cd20 2f 0a 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20  /.  pTo->isInit 
2cd30 3d 20 30 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  = 0;.  TESTONLY(
2cd40 72 63 20 3d 20 29 20 62 74 72 65 65 49 6e 69 74  rc = ) btreeInit
2cd50 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61 73 73  Page(pTo);.  ass
2cd60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2cd70 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OK );..  /* If t
2cd80 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2cd90 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2cda0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2cdb0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
2cdc0 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72   ** for any b-tr
2cdd0 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ee or overflow p
2cde0 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f  ages that pTo no
2cdf0 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  w contains the p
2ce00 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20  ointers to. */. 
2ce10 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2ce20 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  M ){.    rc = se
2ce30 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54  tChildPtrmaps(pT
2ce40 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2ce50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2ce60 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73  is routine redis
2ce70 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f  tributes cells o
2ce80 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78  n the iParentIdx
2ce90 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61  'th child of pPa
2cea0 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74  rent.** (hereaft
2ceb0 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61  er "the page") a
2cec0 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69  nd up to 2 sibli
2ced0 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  ngs so that all 
2cee0 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
2cef0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f   the.** same amo
2cf00 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
2cf10 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e  e. Usually a sin
2cf20 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65  gle sibling on e
2cf30 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
2cf40 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73  e.** page are us
2cf50 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
2cf60 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68  ing, though both
2cf70 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20   siblings might 
2cf80 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a  come from one.**
2cf90 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67   side if the pag
2cfa0 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  e is the first o
2cfb0 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20  r last child of 
2cfc0 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74  its parent. If t
2cfd0 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20  he page .** has 
2cfe0 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62  fewer than 2 sib
2cff0 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67  lings (something
2d000 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   which can only 
2d010 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61  happen if the pa
2d020 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20  ge.** is a root 
2d030 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20  page or a child 
2d040 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20  of a root page) 
2d050 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
2d060 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70  le siblings.** p
2d070 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
2d080 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
2d090 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
2d0a0 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65   siblings of the
2d0b0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69   page might be i
2d0c0 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72  ncreased or decr
2d0d0 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65  eased by .** one
2d0e0 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66   or two in an ef
2d0f0 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
2d100 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
2d110 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
2d120 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  . .**.** Note th
2d130 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  at when this rou
2d140 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
2d150 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  some of the cell
2d160 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
2d170 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
2d180 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
2d190 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
2d1a0 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  . This can happe
2d1b0 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
2d1c0 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68   is overfull. Th
2d1d0 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
2d1e0 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c  es that all cell
2d1f0 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74  s allocated.** t
2d200 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69  o the page and i
2d210 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20  ts siblings fit 
2d220 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61  into MemPage.aDa
2d230 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75  ta[] before retu
2d240 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  rning..**.** In 
2d250 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61  the course of ba
2d260 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65  lancing the page
2d270 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
2d280 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a  s, cells may be.
2d290 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
2d2a0 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   or removed from
2d2b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2d2c0 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e   (pParent). Doin
2d2d0 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73  g so.** may caus
2d2e0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2d2f0 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  e to become over
2d300 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c  full or underful
2d310 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61  l. If this.** ha
2d320 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65  ppens, it is the
2d330 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
2d340 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
2d350 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72   invoke the corr
2d360 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  ect.** balancing
2d370 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20   routine to fix 
2d380 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65  this problem (se
2d390 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  e the balance() 
2d3a0 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a  routine). .**.**
2d3b0 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
2d3c0 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
2d3d0 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20  eason, it might 
2d3e0 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61  leave the databa
2d3f0 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75  se.** in a corru
2d400 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69  pted state. So i
2d410 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
2d420 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61  ails, the databa
2d430 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  se should.** be 
2d440 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
2d450 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67  ** The third arg
2d460 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2d470 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61  nction, aOvflSpa
2d480 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ce, is a pointer
2d490 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20   to a.** buffer 
2d4a0 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
2d4b0 69 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20  in size. If, in 
2d4c0 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20  inserting cells 
2d4d0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a  into the parent.
2d4e0 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  ** page (pParent
2d4f0 29 2c 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ), the parent pa
2d500 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
2d510 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
2d520 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
2d530 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 73  tore the parents
2d540 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
2d550 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75   Because this fu
2d560 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a  nction inserts.*
2d570 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66  * a maximum of f
2d580 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c  our divider cell
2d590 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2d5a0 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20  t page, and the 
2d5b0 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20  maximum.** size 
2d5c0 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64  of a cell stored
2d5d0 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72   within an inter
2d5e0 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  nal node is alwa
2d5f0 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34  ys less than 1/4
2d600 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d  .** of the page-
2d610 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53  size, the aOvflS
2d620 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73  pace[] buffer is
2d630 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2d640 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
2d650 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c  h for all overfl
2d660 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  ow cells..**.** 
2d670 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73  If aOvflSpace is
2d680 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70   set to a null p
2d690 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
2d6a0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
2d6b0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
2d6c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2d6d0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
2d6e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2d6f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2d700 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
2d710 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
2d720 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
2d730 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d750 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
2d760 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
2d770 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
2d780 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
2d790 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
2d7a0 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
2d7b0 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
2d7c0 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
2d7d0 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
2d7e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d7f0 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
2d800 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a  root-page */.){.
2d810 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d830 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
2d840 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
2d850 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2d860 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d870 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
2d880 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
2d890 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
2d8a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
2d8b0 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
2d8c0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
2d8d0 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
2d8e0 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
2d8f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d900 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
2d910 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
2d920 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2d930 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d940 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
2d950 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
2d960 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
2d970 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2d980 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2d990 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
2d9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
2d9b0 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
2d9c0 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
2d9d0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
2d9e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2d9f0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2da00 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
2da10 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
2da20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
2da30 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2da40 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
2da50 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
2da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2da70 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
2da80 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
2da90 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
2daa0 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
2dab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2dac0 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
2dad0 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
2dae0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
2daf0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2db00 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
2db10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
2db20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
2db30 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2db40 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
2db50 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
2db60 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
2db70 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
2db80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2db90 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
2dba0 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
2dbb0 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
2dbc0 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
2dbd0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
2dbe0 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
2dbf0 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
2dc00 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
2dc10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2dc20 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
2dc30 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
2dc40 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
2dc50 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
2dc60 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
2dc70 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
2dc80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
2dc90 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
2dca0 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
2dcb0 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
2dcc0 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
2dcd0 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
2dce0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
2dcf0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
2dd00 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
2dd10 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52  cing */.  u8 *pR
2dd20 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
2dd30 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
2dd40 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20  on in parent of 
2dd50 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f  right-sibling po
2dd60 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61  inter */.  u8 *a
2dd70 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20  pDiv[NB-1];     
2dd80 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
2dd90 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
2dda0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
2ddb0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2ddc0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2ddd0 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
2dde0 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
2ddf0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
2de00 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2de10 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
2de20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
2de30 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
2de40 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2de50 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
2de60 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
2de70 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
2de80 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dea0 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
2deb0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
2dec0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
2ded0 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20  *aSpace1;       
2dee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
2def0 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
2df00 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
2df10 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
2df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df30 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f    /* Temp var to
2df40 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75   store a page nu
2df50 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42  mber in */..  pB
2df60 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74  t = pParent->pBt
2df70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2df80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2df90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2dfa0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2dfb0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2dfc0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2dfd0 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52  ) );..#if 0.  TR
2dfe0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
2dff0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
2e000 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
2e010 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
2e020 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69  t->pgno));.#endi
2e030 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  f..  /* At this 
2e040 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61  point pParent ma
2e050 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  y have at most o
2e060 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ne overflow cell
2e070 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68  . And if.  ** th
2e080 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  is overflow cell
2e090 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20   is present, it 
2e0a0 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c  must be the cell
2e0b0 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65   with .  ** inde
2e0c0 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68  x iParentIdx. Th
2e0d0 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65  is scenario come
2e0e0 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69  s about when thi
2e0f0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
2e100 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72  is called (indir
2e110 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69  ectly) from sqli
2e120 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
2e130 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2e140 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2e150 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
2e160 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
2e170 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
2e180 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
2e190 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76   || pParent->aOv
2e1a0 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65  fl[0].idx==iPare
2e1b0 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20  ntIdx );..  if( 
2e1c0 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20  !aOvflSpace ){. 
2e1d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e1e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
2e1f0 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
2e200 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
2e210 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
2e220 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
2e230 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
2e240 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
2e250 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
2e260 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
2e270 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
2e280 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
2e290 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
2e2a0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
2e2b0 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
2e2c0 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
2e2d0 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
2e2e0 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
2e2f0 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
2e300 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
2e310 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
2e320 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
2e330 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
2e340 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
2e350 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a  re taken.  .  **
2e360 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
2e370 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64  also drops the d
2e380 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
2e390 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
2e3a0 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79  e. This.  ** way
2e3b0 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  , the remainder 
2e3c0 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
2e3d0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
2e3e0 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20   deal with any. 
2e3f0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   ** overflow cel
2e400 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ls in the parent
2e410 20 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e 65   page, as if one
2e420 20 65 78 69 73 74 65 64 20 69 74 20 68 61 73 20   existed it has 
2e430 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
2e440 6e 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20  n removed.  */. 
2e450 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   i = pParent->nO
2e460 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e  verflow + pParen
2e470 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  t->nCell;.  if( 
2e480 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  i<2 ){.    nxDiv
2e490 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d   = 0;.    nOld =
2e4a0 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i+1;.  }else{. 
2e4b0 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20     nOld = 3;.   
2e4c0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2e4d0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
2e4e0 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
2e4f0 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
2e500 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
2e510 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
2e520 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65  iv = i-2;.    }e
2e530 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  lse{.      nxDiv
2e540 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
2e550 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
2e560 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e  ;.  }.  if( (i+n
2e570 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
2e580 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e  verflow)==pParen
2e590 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2e5a0 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e  pRight = &pParen
2e5b0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2e5c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a  ->hdrOffset+8];.
2e5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69    }else{.    pRi
2e5e0 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ght = findCell(p
2e5f0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2e600 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2e610 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20  ow);.  }.  pgno 
2e620 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68  = get4byte(pRigh
2e630 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  t);.  while( 1 )
2e640 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
2e650 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2e660 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  gno, &apOld[i]);
2e670 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2e680 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
2e690 64 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d  d, 0, i*sizeof(M
2e6a0 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
2e6b0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2e6c0 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
2e6d0 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
2e6e0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
2e6f0 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
2e700 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d  low;.    if( (i-
2e710 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  -)==0 ) break;..
2e720 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d      if( pParent-
2e730 3e 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69 2b  >nOverflow && i+
2e740 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
2e750 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a  aOvfl[0].idx ){.
2e760 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
2e770 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b   pParent->aOvfl[
2e780 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  0].pCell;.      
2e790 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
2e7a0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2e7b0 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
2e7c0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
2e7d0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
2e7e0 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72    pParent->nOver
2e7f0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65  flow = 0;.    }e
2e800 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76  lse{.      apDiv
2e810 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
2e820 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2e830 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2e840 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ow);.      pgno 
2e850 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
2e860 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
2e870 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
2e880 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
2e890 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  v[i]);..      /*
2e8a0 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66   Drop the cell f
2e8b0 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2e8c0 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74  age. apDiv[i] st
2e8d0 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20  ill points to.  
2e8e0 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20      ** the cell 
2e8f0 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e  within the paren
2e900 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  t, even though i
2e910 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70  t has been dropp
2e920 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ed..      ** Thi
2e930 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
2e940 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c  e dropping a cel
2e950 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  l only overwrite
2e960 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  s the first.    
2e970 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
2e980 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20  of it, and this 
2e990 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2e9a0 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74  t need the first
2e9b0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
2e9c0 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  ytes of the divi
2e9d0 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65  der cell. So the
2e9e0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65   pointer is safe
2e9f0 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a   to use.      **
2ea00 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20   later on.  .   
2ea10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
2ea20 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20  nless SQLite is 
2ea30 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75  compiled in secu
2ea40 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20  re-delete mode. 
2ea50 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20  In this case,.  
2ea60 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43      ** the dropC
2ea70 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ell() routine wi
2ea80 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2ea90 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74   entire cell wit
2eaa0 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20  h zeroes..      
2eab0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
2eac0 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70   temporarily cop
2ead0 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20  y the cell into 
2eae0 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d  the aOvflSpace[]
2eaf0 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72  .      ** buffer
2eb00 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70  . It will be cop
2eb10 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73  ied out again as
2eb20 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70   soon as the aSp
2eb30 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20  ace[] buffer.   
2eb40 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74     ** is allocat
2eb50 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  ed.  */.#ifdef S
2eb60 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
2eb70 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ETE.      memcpy
2eb80 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44  (&aOvflSpace[apD
2eb90 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61  iv[i]-pParent->a
2eba0 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c  Data], apDiv[i],
2ebb0 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20   szNew[i]);.    
2ebc0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f    apDiv[i] = &aO
2ebd0 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
2ebe0 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
2ebf0 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ];.#endif.      
2ec00 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2ec10 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
2ec20 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a  t->nOverflow, sz
2ec30 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  New[i]);.    }. 
2ec40 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
2ec50 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
2ec60 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72  le of 4 in order
2ec70 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
2ec80 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
2ec90 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
2eca0 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
2ecb0 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20   3)&~3;..  /*.  
2ecc0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
2ecd0 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
2ece0 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b  uctures.  */.  k
2ecf0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
2ed00 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
2ed10 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a  (MemPage));.  sz
2ed20 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
2ed30 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2ed40 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed60 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
2ed70 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
2ed80 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eda0 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
2edb0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20   pBt->pageSize  
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ede0 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20  aSpace1 */.     
2edf0 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20  + k*nOld;       
2ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee20 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70   Page copies (ap
2ee30 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c  Copy) */.  apCel
2ee40 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
2ee50 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
2ee60 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
2ee70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
2ee80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2ee90 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
2eea0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2eeb0 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
2eec0 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
2eed0 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d  ls];.  aSpace1 =
2eee0 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d   (u8*)&szCell[nM
2eef0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65  axCells];.  asse
2ef00 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2ef10 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31  LIGNMENT(aSpace1
2ef20 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
2ef30 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
2ef40 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
2ef50 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
2ef60 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
2ef70 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
2ef80 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
2ef90 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
2efa0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
2efb0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
2efc0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
2efd0 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20   from aSpace1[] 
2efe0 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
2eff0 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
2f000 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
2f010 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
2f020 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2f030 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
2f040 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
2f050 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
2f060 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
2f070 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
2f080 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
2f090 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
2f0a0 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
2f0b0 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
2f0c0 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
2f0d0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
2f0e0 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
2f0f0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
2f100 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
2f110 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
2f120 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
2f130 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
2f140 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
2f150 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
2f160 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2f170 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
2f180 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
2f190 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
2f1a0 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
2f1b0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
2f1c0 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
2f1d0 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
2f1e0 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
2f1f0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
2f200 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
2f210 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
2f220 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65    */.  leafCorre
2f230 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d  ction = apOld[0]
2f240 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
2f250 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  Data = apOld[0]-
2f260 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
2f270 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2f280 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ){.    int limit
2f290 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65  ;.    .    /* Be
2f2a0 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
2f2b0 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61  ing else, take a
2f2c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74   copy of the i't
2f2d0 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69  h original sibli
2f2e0 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  ng.    ** The re
2f2f0 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
2f300 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
2f310 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
2f320 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20  s rather.    ** 
2f330 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
2f340 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
2f350 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
2f360 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
2f370 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f      ** process o
2f380 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
2f390 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ten.  */.    Mem
2f3a0 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
2f3b0 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
2f3c0 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d  e*)&aSpace1[pBt-
2f3d0 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d  >pageSize + k*i]
2f3e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
2f3f0 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  d, apOld[i], siz
2f400 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
2f410 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d     pOld->aData =
2f420 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d   (void*)&pOld[1]
2f430 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
2f440 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  d->aData, apOld[
2f450 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
2f460 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
2f470 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
2f480 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
2f490 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
2f4a0 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
2f4b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2f4c0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
2f4d0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
2f4e0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
2f4f0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
2f500 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
2f510 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
2f520 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
2f530 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
2f540 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
2f550 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
2f560 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
2f570 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
2f580 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
2f590 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
2f5a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2f5b0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
2f5c0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2f5d0 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
2f5e0 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
2f5f0 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
2f600 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
2f610 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
2f620 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
2f630 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4 );.      asser
2f640 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d  t( iSpace1<=pBt-
2f650 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
2f660 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
2f670 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
2f680 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
2f690 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
2f6a0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
2f6b0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2f6c0 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c  rrection==0 || l
2f6d0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2f6e0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
2f6f0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c  [nCell] = szCell
2f700 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f  [nCell] - leafCo
2f710 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2f720 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
2f730 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2f740 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2f750 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
2f760 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64  assert( pOld->hd
2f770 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  rOffset==0 );.  
2f780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
2f790 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
2f7a0 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
2f7b0 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
2f7c0 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ft.        ** po
2f7d0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
2f7e0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
2f7f0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
2f800 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
2f810 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
2f820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f830 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2f840 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
2f850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
2f860 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
2f870 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
2f880 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
2f890 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
2f8a0 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
2f8b0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2f8c0 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
2f8d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f8e0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2f8f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
2f900 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
2f910 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2f920 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
2f930 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
2f940 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
2f950 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
2f960 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
2f970 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
2f980 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
2f990 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
2f9a0 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
2f9b0 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
2f9c0 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
2f9d0 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
2f9e0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
2f9f0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
2fa00 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
2fa10 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
2fa20 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
2fa30 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
2fa40 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
2fa50 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
2fa60 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
2fa70 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
2fa80 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
2fa90 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
2faa0 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
2fab0 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
2fac0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
2fad0 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
2fae0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
2faf0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
2fb00 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
2fb10 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
2fb20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
2fb30 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
2fb40 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2fb50 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
2fb60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2fb70 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
2fb80 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
2fb90 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
2fba0 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
2fbb0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
2fbc0 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
2fbd0 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
2fbe0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
2fbf0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
2fc00 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
2fc10 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
2fc20 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
2fc30 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
2fc40 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
2fc50 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
2fc60 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
2fc70 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
2fc80 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
2fc90 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
2fca0 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
2fcb0 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
2fcc0 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
2fcd0 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b     if( k>NB+1 ){
2fce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2fcf0 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e  RUPT; goto balan
2fd00 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20  ce_cleanup; }.  
2fd10 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
2fd20 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
2fd30 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
2fd40 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
2fd50 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
2fd60 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
2fd70 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
2fd80 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
2fd90 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
2fda0 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
2fdb0 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
2fdc0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
2fdd0 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
2fde0 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
2fdf0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
2fe00 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
2fe10 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
2fe20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
2fe30 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
2fe40 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
2fe50 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
2fe60 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
2fe70 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
2fe80 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
2fe90 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
2fea0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
2feb0 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
2fec0 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
2fed0 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
2fee0 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
2fef0 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
2ff00 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
2ff10 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
2ff20 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
2ff30 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
2ff40 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
2ff50 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
2ff60 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
2ff70 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
2ff80 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
2ff90 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
2ffa0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
2ffb0 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
2ffc0 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
2ffd0 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
2ffe0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
2fff0 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
30000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
30010 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
30020 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
30030 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
30040 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
30050 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
30060 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
30070 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
30080 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
30090 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
300a0 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
300b0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
300c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
300d0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
300e0 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
300f0 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
30100 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
30110 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
30120 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
30130 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
30140 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
30150 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
30160 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
30170 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
30180 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
30190 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
301a0 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
301b0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
301c0 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
301d0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
301e0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
301f0 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
30200 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
30210 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
30220 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
30230 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
30240 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
30250 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
30260 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
30270 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
30280 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
30290 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
302a0 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
302b0 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
302c0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
302d0 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
302e0 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
302f0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
30300 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
30310 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
30320 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25  CE: old: %d %d %
30330 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b  d  ",.    apOld[
30340 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e  0]->pgno, .    n
30350 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31  Old>=2 ? apOld[1
30360 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20  ]->pgno : 0,.   
30370 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64   nOld>=3 ? apOld
30380 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20  [2]->pgno : 0.  
30390 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ));..  /*.  ** A
303a0 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61  llocate k new pa
303b0 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20  ges.  Reuse old 
303c0 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73  pages where poss
303d0 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ible..  */.  if(
303e0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c   apOld[0]->pgno<
303f0 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =1 ){.    rc = S
30400 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
30410 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
30420 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
30430 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
30440 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
30450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
30460 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
30470 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
30480 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
30490 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
304a0 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
304b0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
304c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
304d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
304e0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
304f0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
30500 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
30510 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30530 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
30540 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
30550 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
30560 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
30570 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
30580 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
30590 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
305a0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
305b0 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
305c0 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
305d0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
305e0 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
305f0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
30600 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
30610 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
30620 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
30630 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d  apPut(pBt, pNew-
30640 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
30650 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
30660 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
30670 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30680 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
30690 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
306a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
306b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
306c0 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
306d0 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
306e0 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
306f0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
30700 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
30710 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
30720 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
30730 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
30740 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
30750 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
30760 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
30770 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
30780 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
30790 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
307a0 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
307b0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
307c0 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
307d0 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
307e0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
307f0 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
30800 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
30810 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
30820 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
30830 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
30840 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
30850 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
30860 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
30870 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
30880 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
30890 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
308a0 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
308b0 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
308c0 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
308d0 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
308e0 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
308f0 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
30900 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
30910 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
30920 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
30930 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
30940 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
30950 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
30960 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
30970 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
30980 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
30990 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
309a0 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
309b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
309c0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
309d0 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
309e0 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
309f0 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
30a00 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
30a10 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
30a20 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
30a30 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
30a40 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
30a50 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
30a60 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
30a70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
30a80 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
30a90 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
30aa0 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
30ab0 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d     t = apNew[i]-
30ac0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20  >pgno;.      pT 
30ad0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
30ae0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
30af0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
30b00 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
30b10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
30b20 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
30b30 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
30b40 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
30b50 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
30b60 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
30b70 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
30b80 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
30b90 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
30ba0 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
30bb0 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
30bc0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
30bd0 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
30be0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
30bf0 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
30c00 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
30c10 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
30c20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
30c30 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
30c40 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
30c50 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
30c60 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30c70 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30c80 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
30c90 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
30ca0 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
30cb0 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
30cc0 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
30cd0 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
30ce0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
30cf0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
30d00 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
30d10 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
30d20 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
30d30 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
30d40 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
30d50 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
30d60 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
30d70 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
30d80 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
30d90 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
30da0 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
30db0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
30dc0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
30dd0 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
30de0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
30df0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
30e00 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
30e10 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
30e20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
30e30 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
30e40 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
30e50 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
30e60 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
30e70 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
30e80 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
30e90 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
30ea0 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
30eb0 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
30ec0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
30ed0 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
30ee0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
30ef0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
30f00 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
30f10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
30f20 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43  <nNew-1 || j==nC
30f30 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ell );.    if( j
30f40 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
30f50 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
30f60 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
30f70 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
30f80 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
30f90 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
30fa0 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
30fb0 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
30fc0 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
30fd0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
30fe0 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  emp = &aOvflSpac
30ff0 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20  e[iOvflSpace];. 
31000 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
31010 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
31020 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
31030 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
31040 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
31050 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
31060 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
31070 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
31080 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
31090 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
310a0 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
310b0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
310c0 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
310d0 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
310e0 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
310f0 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
31100 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
31110 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
31120 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
31130 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
31140 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
31150 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
31160 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
31170 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31180 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
31190 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
311a0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
311b0 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
311c0 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
311d0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
311e0 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
311f0 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69  sz = 4 + putVari
31200 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e  nt(&pCell[4], in
31210 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  fo.nKey);.      
31220 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
31230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31240 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
31250 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
31260 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
31270 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
31280 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
31290 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
312a0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
312b0 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
312c0 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70  ode, and its rep
312d0 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34  orted size was 4
312e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
312f0 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61  s, then it may a
31300 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c  ctually be small
31310 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20  er than this .  
31320 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74        ** (see bt
31330 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
31340 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
31350 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
31360 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
31370 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
31380 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
31390 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
313a0 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
313b0 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
313c0 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
313d0 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
313e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
313f0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
31400 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
31410 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
31420 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
31430 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
31440 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
31450 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
31460 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
31470 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
31480 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
31490 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
314a0 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
314b0 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
314c0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
314d0 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
314e0 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
314f0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
31500 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
31510 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
31520 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
31530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31540 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20       iOvflSpace 
31550 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
31560 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
31570 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
31580 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53    assert( iOvflS
31590 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
315a0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ize );.      rc 
315b0 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
315c0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
315d0 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70  ll, sz, pTemp, p
315e0 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  New->pgno);.    
315f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31600 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
31610 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
31620 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31630 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
31640 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
31650 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b  ge) );..      j+
31660 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
31670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
31680 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
31690 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
316a0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
316b0 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
316c0 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
316d0 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
316e0 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61   u8 *zChild = &a
316f0 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61  pCopy[nOld-1]->a
31700 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d  Data[8];.    mem
31710 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d  cpy(&apNew[nNew-
31720 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43  1]->aData[8], zC
31730 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20  hild, 4);.  }.. 
31740 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70   if( isRoot && p
31750 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
31760 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72   && pParent->hdr
31770 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d  Offset<=apNew[0]
31780 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f  ->nFree ){.    /
31790 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
317a0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
317b0 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  w contains no ce
317c0 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69  lls. The only si
317d0 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67  bling.    ** pag
317e0 65 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  e is the right-c
317f0 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  hild of the pare
31800 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e  nt. Copy the con
31810 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
31820 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69   ** child page i
31830 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20  nto the parent, 
31840 64 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f  decreasing the o
31850 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66  verall height of
31860 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72   the.    ** b-tr
31870 65 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20  ee structure by 
31880 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73  one. This is des
31890 63 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62  cribed as the "b
318a0 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72  alance-shallower
318b0 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67  ".    ** sub-alg
318c0 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64  orithm in some d
318d0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20  ocumentation..  
318e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
318f0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
31900 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
31910 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79  the call to copy
31920 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20  NodeContent() . 
31930 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70     ** sets all p
31940 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
31950 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
31960 20 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61   to database ima
31970 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
31980 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70   for which the p
31990 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64  ointer is stored
319a0 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74   within the cont
319b0 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64  ent being copied
319c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
319d0 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72  The second asser
319e0 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  t below verifies
319f0 20 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20   that the child 
31a00 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65  page is defragme
31a10 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20  nted.    ** (it 
31a20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77  must be, as it w
31a30 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72  as just reconstr
31a40 75 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65  ucted using asse
31a50 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69  mblePage()). Thi
31a60 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f  s.    ** is impo
31a70 72 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72  rtant if the par
31a80 65 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73  ent page happens
31a90 20 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66   to be page 1 of
31aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
31ab0 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a    ** image.  */.
31ac0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77      assert( nNew
31ad0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
31ae0 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t( apNew[0]->nFr
31af0 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28  ee == .        (
31b00 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b  get2byte(&apNew[
31b10 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70  0]->aData[5])-ap
31b20 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73  New[0]->cellOffs
31b30 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65  et-apNew[0]->nCe
31b40 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20  ll*2) .    );.  
31b50 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
31b60 3d 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43  =(rc = copyNodeC
31b70 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c  ontent(apNew[0],
31b80 20 70 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20   pParent)) ){.  
31b90 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
31ba0 65 28 61 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20  e(apNew[0]);.   
31bb0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49   }.  }else if( I
31bc0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
31bd0 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
31be0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
31bf0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
31c00 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
31c10 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
31c20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
31c30 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
31c40 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
31c50 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
31c60 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
31c70 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
31c80 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
31c90 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
31ca0 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
31cb0 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
31cc0 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
31cd0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
31ce0 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
31cf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
31d00 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
31d10 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
31d20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
31d30 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
31d40 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
31d50 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
31d60 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
31d70 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
31d80 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
31d90 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
31da0 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
31db0 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
31dc0 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
31dd0 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
31de0 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
31df0 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
31e00 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
31e10 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
31e20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
31e30 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
31e40 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
31e50 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
31e60 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
31e70 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
31e80 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
31e90 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
31ea0 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
31eb0 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
31ec0 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
31ed0 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
31ee0 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
31ef0 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
31f00 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
31f10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
31f20 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
31f30 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
31f40 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
31f50 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
31f60 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
31f70 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
31f80 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
31f90 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
31fa0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
31fb0 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
31fc0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
31fd0 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
31fe0 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
31ff0 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
32000 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
32010 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
32020 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
32030 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
32040 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
32050 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
32060 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
32070 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
32080 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
32090 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
320a0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
320b0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
320c0 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
320d0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
320e0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
320f0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
32100 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
32110 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
32120 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
32130 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
32140 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
32150 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
32160 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
32170 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
32180 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
32190 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
321a0 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
321b0 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
321c0 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
321d0 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
321e0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
321f0 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
32200 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
32210 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
32220 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
32230 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
32240 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
32250 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
32260 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
32270 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
32280 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
32290 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
322a0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
322b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
322c0 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
322d0 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
322e0 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
322f0 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
32300 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
32310 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
32320 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
32330 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
32340 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
32350 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
32360 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32380 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
32390 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
323a0 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
323b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
323d0 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
323e0 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
323f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20  or(i=0; i<nCell 
32400 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
32410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
32420 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
32430 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
32440 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
32450 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
32460 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
32470 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
32480 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
32490 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
324a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
324b0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
324c0 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
324d0 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
324e0 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
324f0 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
32500 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
32510 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ll. */.        p
32520 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a  Old = apCopy[++j
32530 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ];.        iNext
32540 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  Old = i + !leafD
32550 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c  ata + pOld->nCel
32560 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  l + pOld->nOverf
32570 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  low;.        if(
32580 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
32590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
325a0 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
325b0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
325c0 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d       iOverflow =
325d0 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
325e0 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
325f0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  idx;.        }. 
32600 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
32610 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a   = !leafData;  .
32620 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
32630 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e  ssert(nOverflow>
32640 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69  0 || iOverflow<i
32650 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
32660 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20  (nOverflow<2 || 
32670 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
32680 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
32690 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  1].idx-1);.     
326a0 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
326b0 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<3 || pOld->aOv
326c0 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[1].idx==pOld-
326d0 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29  >aOvfl[2].idx-1)
326e0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
326f0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
32700 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
32710 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
32720 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
32730 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
32740 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
32750 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
32760 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
32770 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
32780 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
32790 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
327a0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
327b0 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
327c0 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
327d0 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
327e0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
327f0 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
32800 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
32810 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
32820 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
32830 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
32840 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
32850 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
32860 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
32870 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
32880 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
32890 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
328a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
328b0 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20  ( j<nOld );.    
328c0 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77    assert( k<nNew
328d0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
328e0 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72   the cell was or
328f0 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72  iginally divider
32900 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f   cell (and is no
32910 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20  t now) or.      
32920 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ** an overflow c
32930 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ell, or if the c
32940 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ell was located 
32950 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  on a different s
32960 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ibling.      ** 
32970 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20  page before the 
32980 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20  balancing, then 
32990 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
329a0 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
329b0 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  ed.      ** with
329c0 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76   any child or ov
329d0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65  erflow pages nee
329e0 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
329f0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
32a00 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64  sDivider || pOld
32a10 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
32a20 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
32a30 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
32a40 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  n ){.          r
32a50 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
32a60 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65  t, get4byte(apCe
32a70 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ll[i]), PTRMAP_B
32a80 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
32a90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32aa0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
32ab0 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  i]>pNew->minLoca
32ac0 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l && rc==SQLITE_
32ad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32ae0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
32af0 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  flPtr(pNew, apCe
32b00 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ll[i]);.        
32b10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
32b20 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
32b30 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
32b40 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
32b50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e  QLITE_OK && i<nN
32b60 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ew; i++){.      
32b70 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
32b80 28 0a 09 20 20 20 20 70 42 74 2c 20 67 65 74 34  (..    pBt, get4
32b90 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e  byte(&apNew[i]->
32ba0 61 44 61 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41  aData[8]), PTRMA
32bb0 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69  P_BTREE, apNew[i
32bc0 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ]->pgno);.      
32bd0 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
32be0 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
32bf0 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
32c00 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
32c10 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
32c20 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
32c30 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
32c40 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
32c50 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
32c60 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
32c70 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
32c80 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
32c90 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
32ca0 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
32cb0 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
32cc0 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
32cd0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
32ce0 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
32cf0 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
32d00 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
32d10 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
32d20 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
32d30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
32d40 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
32d50 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
32d60 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
32d70 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
32d80 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
32d90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
32da0 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
32db0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
32dc0 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
32dd0 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
32de0 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
32df0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
32e00 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
32e10 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
32e20 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
32e30 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
32e40 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
32e50 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
32e60 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
32e70 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  w[i]);.  }..  re
32e80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
32e90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
32ea0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
32eb0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
32ec0 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
32ed0 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75  ure is.** overfu
32ee0 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ll (has one or m
32ef0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
32f00 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  es)..**.** A new
32f10 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61   child page is a
32f20 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
32f30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
32f40 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a   current root.**
32f50 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67   page, including
32f60 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c   overflow cells,
32f70 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f   are copied into
32f80 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20   the child. The 
32f90 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
32fa0 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e  then overwritten
32fb0 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65   to make it an e
32fc0 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74  mpty page with t
32fd0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a  he right-child .
32fe0 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ** pointer point
32ff0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70  ing to the new p
33000 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  age..**.** Befor
33010 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c  e returning, all
33020 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
33030 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
33040 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20  ng to pages .** 
33050 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69  that the new chi
33060 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74  ld-page now cont
33070 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
33080 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68   are updated. Th
33090 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65  e.** entry corre
330a0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
330b0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
330c0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72  pointer of the r
330d0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  oot.** page is a
330e0 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  lso updated..**.
330f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
33100 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  , *ppChild is se
33110 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72  t to contain a r
33120 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
33130 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61  child .** page a
33140 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
33150 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
33160 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
33170 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  r is required.**
33180 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
33190 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69  Page() on *ppChi
331a0 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ld exactly once.
331b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
331c0 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
331d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
331e0 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69  d and *ppChild i
331f0 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
33200 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
33210 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
33220 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65   *pRoot, MemPage
33230 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69   **ppChild){.  i
33240 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
33250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33260 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
33270 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
33280 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
33290 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
332a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
332b0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
332c0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
332d0 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  noChild;        
332e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
332f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
33300 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
33310 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33320 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20  = pRoot->pBt;   
33330 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
33340 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
33350 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  t->nOverflow>0 )
33360 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
33370 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
33380 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
33390 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20   /* Make pRoot, 
333a0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
333b0 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69   the b-tree, wri
333c0 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20  table. Allocate 
333d0 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65  a new .  ** page
333e0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
333f0 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  e the new right-
33400 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20  child of pPage. 
33410 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
33420 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f  s.  ** of the no
33430 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f  de stored on pRo
33440 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  ot into the new 
33450 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f  child page..  */
33460 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
33470 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
33480 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
33490 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c  >pDbPage)).   ||
334a0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
334b0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
334c0 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c  age(pBt,&pChild,
334d0 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74  &pgnoChild,pRoot
334e0 2d 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c  ->pgno,0)).   ||
334f0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
33500 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  = copyNodeConten
33510 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29  t(pRoot, pChild)
33520 29 0a 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56  ).   || (ISAUTOV
33530 41 43 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20  ACUUM && .      
33540 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
33550 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
33560 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d   pgnoChild, PTRM
33570 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d  AP_BTREE, pRoot-
33580 3e 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20  >pgno))).  ){.  
33590 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a    *ppChild = 0;.
335a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
335b0 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74  pChild);.    ret
335c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
335d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
335e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
335f0 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
33600 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
33610 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33620 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
33630 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
33640 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d   pChild->nCell==
33650 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pRoot->nCell );.
33660 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
33670 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
33680 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f   into %d\n", pRo
33690 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ot->pgno, pChild
336a0 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20  ->pgno));..  /* 
336b0 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f  Copy the overflo
336c0 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f  w cells from pRo
336d0 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a  ot to pChild */.
336e0 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
336f0 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61  >aOvfl, pRoot->a
33700 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76  Ovfl, pRoot->nOv
33710 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52  erflow*sizeof(pR
33720 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b  oot->aOvfl[0]));
33730 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
33740 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f  flow = pRoot->nO
33750 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a  verflow;..  /* Z
33760 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ero the contents
33770 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20   of pRoot. Then 
33780 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61  install pChild a
33790 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
337a0 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65  d. */.  zeroPage
337b0 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e  (pRoot, pChild->
337c0 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
337d0 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
337e0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
337f0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
33800 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
33810 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70  ..  *ppChild = p
33820 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Child;.  return 
33830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
33840 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61  .** The page tha
33850 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79  t pCur currently
33860 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a   points to has j
33870 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ust been modifie
33880 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79  d in.** some way
33890 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
338a0 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74  figures out if t
338b0 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  his modification
338c0 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72   means the.** tr
338d0 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ee needs to be b
338e0 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20  alanced, and if 
338f0 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70  so calls the app
33900 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
33910 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20  ng .** routine. 
33920 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  Balancing routin
33930 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
33940 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a  balance_quick().
33950 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65  **   balance_dee
33960 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  per().**   balan
33970 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a  ce_nonroot().*/.
33980 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
33990 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ce(BtCursor *pCu
339a0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
339b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
339c0 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75  t int nMin = pCu
339d0 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  r->pBt->usableSi
339e0 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38  ze * 2 / 3;.  u8
339f0 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33a00 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70  ace[13];.  u8 *p
33a10 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53  Free = 0;..  TES
33a20 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
33a30 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20  ce_quick_called 
33a40 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  = 0 );.  TESTONL
33a50 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  Y( int balance_d
33a60 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30  eeper_called = 0
33a70 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
33a80 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
33a90 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d  ->iPage;.    Mem
33aa0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
33ab0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
33ac0 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67  ];..    if( iPag
33ad0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e==0 ){.      if
33ae0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
33af0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ow ){.        /*
33b00 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
33b10 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  f the b-tree is 
33b20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69  overfull. In thi
33b30 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a  s case call the.
33b40 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
33b50 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63  ce_deeper() func
33b60 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
33b70 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74   new child for t
33b80 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
33b90 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79       ** and copy
33ba0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
33bb0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
33bc0 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68  t-page to it. Th
33bd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78  e.        ** nex
33be0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
33bf0 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
33c00 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c  balance the chil
33c10 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  d page..        
33c20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  */ .        asse
33c30 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65  rt( (balance_dee
33c40 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  per_called++)==0
33c50 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
33c60 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
33c70 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70  pPage, &pCur->ap
33c80 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20  Page[1]);.      
33c90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33ca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33cb0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31   pCur->iPage = 1
33cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
33cd0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
33ce0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
33cf0 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20  aiIdx[1] = 0;.  
33d00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33d10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d  pCur->apPage[1]-
33d20 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
33d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33d40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65  lse{.        bre
33d50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
33d60 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d  }else if( pPage-
33d70 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
33d80 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e   pPage->nFree<=n
33d90 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65  Min ){.      bre
33da0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
33db0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63       MemPage * c
33dc0 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70  onst pParent = p
33dd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
33de0 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  e-1];.      int 
33df0 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75  const iIdx = pCu
33e00 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31  r->aiIdx[iPage-1
33e10 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ];..      rc = s
33e20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33e30 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
33e40 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
33e50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
33e60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33e70 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
33e80 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
33e90 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20  e->hasData.     
33ea0 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f      && pPage->nO
33eb0 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20  verflow==1.     
33ec0 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f      && pPage->aO
33ed0 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
33ee0 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  e->nCell.       
33ef0 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67    && pParent->pg
33f00 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26  no!=1.         &
33f10 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
33f20 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29  ==iIdx.        )
33f30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
33f40 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  all balance_quic
33f50 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20  k() to create a 
33f60 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70  new sibling of p
33f70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20  Page on which.  
33f80 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74          ** to st
33f90 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ore the overflow
33fa0 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71   cell. balance_q
33fb0 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61  uick() inserts a
33fc0 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20   new cell.      
33fd0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72      ** into pPar
33fe0 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
33ff0 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65  ause pParent ove
34000 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20  rflow. If this. 
34010 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70           ** happ
34020 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e  ens, the next in
34030 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
34040 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
34050 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20  ance pParent .  
34060 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65          ** use e
34070 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f  ither balance_no
34080 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e  nroot() or balan
34090 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74  ce_deeper(). Unt
340a0 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  il this.        
340b0 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68    ** happens, th
340c0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
340d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
340e0 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
340f0 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  ace[].          
34100 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  ** buffer. .    
34110 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34120 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73     ** The purpos
34130 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
34140 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74  ng assert() is t
34150 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c  o check that onl
34160 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y a.          **
34170 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20   single call to 
34180 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
34190 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68  is made for each
341a0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
341b0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
341c0 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72  ion. If this wer
341d0 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20  e not verified, 
341e0 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76  a subtle bug inv
341f0 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20  olving reuse.   
34200 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
34210 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
34220 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61  ace[] might snea
34230 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  k in..          
34240 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
34250 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75  ert( (balance_qu
34260 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  ick_called++)==0
34270 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
34280 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b   = balance_quick
34290 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c  (pParent, pPage,
342a0 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
342b0 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ace);.        }e
342c0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
342d0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f     {.          /
342e0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
342f0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  call balance_non
34300 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74  root() to redist
34310 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20  ribute cells.   
34320 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
34330 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
34340 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69  o 2 of its sibli
34350 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69  ng pages. This i
34360 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20  nvolves.        
34370 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74    ** modifying t
34380 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
34390 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61  Parent, which ma
343a0 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20  y cause pParent 
343b0 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
343c0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
343d0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68  or underfull. Th
343e0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
343f0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a   of the do-loop.
34400 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c            ** wil
34410 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61  l balance the pa
34420 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72  rent page to cor
34430 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20  rect this..     
34440 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
34450 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72     ** If the par
34460 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
34470 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f   overfull, the o
34480 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20  verflow cell or 
34490 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20  cells.          
344a0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
344b0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
344c0 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d  er allocated imm
344d0 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20  ediately below. 
344e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20  .          ** A 
344f0 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
34500 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
34510 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69  oop will deal wi
34520 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20  th this by.     
34530 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
34540 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34550 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ) (balance_deepe
34560 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  r() may be calle
34570 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20  d first,.       
34580 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65     ** but it doe
34590 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f  sn't deal with o
345a0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20  verflow cells - 
345b0 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20  just moves them 
345c0 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  to a.          *
345d0 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  * different page
345e0 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62  ). Once this sub
345f0 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
34600 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34610 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ) .          ** 
34620 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69  has completed, i
34630 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c  t is safe to rel
34640 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20  ease the pSpace 
34650 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20  buffer used by. 
34660 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
34670 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61  previous call, a
34680 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  s the overflow c
34690 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61  ell data will ha
346a0 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  ve been .       
346b0 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74     ** copied eit
346c0 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  her into the bod
346d0 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  y of a database 
346e0 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65  page or into the
346f0 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a   new.          *
34700 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  * pSpace buffer 
34710 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61  passed to the la
34720 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c  tter call to bal
34730 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a  ance_nonroot()..
34740 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
34750 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63         u8 *pSpac
34760 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
34770 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d  alloc(pCur->pBt-
34780 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
34790 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
347a0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65  ce_nonroot(pPare
347b0 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65  nt, iIdx, pSpace
347c0 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20  , iPage==1);.   
347d0 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65         if( pFree
347e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
347f0 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e  /* If pFree is n
34800 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e  ot NULL, it poin
34810 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65  ts to the pSpace
34820 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20   buffer used .  
34830 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
34840 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20  a previous call 
34850 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
34860 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e  ot(). Its conten
34870 74 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20  ts are.         
34880 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64     ** now stored
34890 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20   either on real 
348a0 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f  database pages o
348b0 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20  r within the .  
348c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77            ** new
348d0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20   pSpace buffer, 
348e0 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66  so it may be saf
348f0 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20  ely freed here. 
34900 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
34910 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
34920 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
34930 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
34940 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
34950 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  er will be freed
34960 20 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20   after the next 
34970 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
34980 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e    ** balance_non
34990 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20  root(), or just 
349a0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
349b0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68  tion returns, wh
349c0 69 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20  ichever.        
349d0 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74    ** comes first
349e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
349f0 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20  Free = pSpace;. 
34a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34a10 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ..      pPage->n
34a20 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
34a30 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
34a40 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
34a50 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63  e do-loop balanc
34a60 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  es the parent pa
34a70 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c  ge. */.      rel
34a80 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
34a90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61  .      pCur->iPa
34aa0 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  ge--;.    }.  }w
34ab0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
34ac0 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46  _OK );..  if( pF
34ad0 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
34ae0 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
34af0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34b00 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rc;.}.../*.** In
34b10 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
34b20 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65  d into the BTree
34b30 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69  .  The key is gi
34b40 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65  ven by (pKey,nKe
34b50 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  y).** and the da
34b60 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ta is given by (
34b70 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54  pData,nData).  T
34b80 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
34b90 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66  d only to.** def
34ba0 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74  ine what table t
34bb0 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
34bc0 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
34bd0 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
34be0 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
34bf0 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
34c00 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ocation..**.** F
34c10 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
34c20 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  le, only the nKe
34c30 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b  y value of the k
34c40 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  ey is used.  pKe
34c50 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
34c60 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41    For a ZERODATA
34c70 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74   table, the pDat
34c80 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20  a and nData are 
34c90 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  both ignored..**
34ca0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52  .** If the seekR
34cb0 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
34cc0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
34cd0 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63  n a successful c
34ce0 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f  all to.** Moveto
34cf0 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65  Unpacked() to se
34d00 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74  ek cursor pCur t
34d10 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68  o (pKey, nKey) h
34d20 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
34d30 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65  en performed. se
34d40 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  ekResult is the 
34d50 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65  search result re
34d60 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69  turned (a negati
34d70 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20  ve.** number if 
34d80 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
34d90 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20  n entry that is 
34da0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b  smaller than (pK
34db0 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a  ey, nKey), or.**
34dc0 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
34dd0 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73  e if pCur points
34de0 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74   at an etry that
34df0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
34e00 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29  .** (pKey, nKey)
34e10 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ). .**.** If the
34e20 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
34e30 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
34e40 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79   cursor pCur may
34e50 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a   point to any .*
34e60 2a 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f  * entry or to no
34e70 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20 49   entry at all. I
34e80 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
34e90 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f   function has to
34ea0 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72   seek.** the cur
34eb0 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e  sor before the n
34ec0 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e  ew key can be in
34ed0 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
34ee0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
34ef0 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
34f00 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
34f10 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
34f20 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
34f30 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
34f40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
34f50 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
34f60 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
34f70 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
34f80 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
34f90 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
34fa0 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
34fb0 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
34fc0 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
34fd0 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
34fe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34ff0 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
35000 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
35010 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
35020 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20  pendBias,       
35030 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
35040 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
35050 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
35060 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74    int seekResult
35070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35080 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72   /* Result of pr
35090 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  ior MovetoUnpack
350a0 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a  ed() call */.){.
350b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
350c0 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74  loc = seekResult
350d0 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20  ;.  int szNew;. 
350e0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
350f0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
35100 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
35110 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
35120 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
35130 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35140 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
35150 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
35160 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ell = 0;..  asse
35170 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
35180 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
35190 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
351a0 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  Flag && pBt->inT
351b0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
351c0 53 5f 57 52 49 54 45 20 26 26 20 21 70 42 74 2d  S_WRITE && !pBt-
351d0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
351e0 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
351f0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
35200 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
35210 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  , pCur->pKeyInfo
35220 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a  !=0, 2) );..  /*
35230 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
35240 20 63 61 6c 6c 65 72 20 68 61 73 20 62 65 65 6e   caller has been
35250 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20 49 66 20   consistent. If 
35260 74 68 69 73 20 63 75 72 73 6f 72 20 77 61 73 20  this cursor was 
35270 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65  opened.  ** expe
35280 63 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62  cting an index b
35290 2d 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20  -tree, then the 
352a0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65  caller should be
352b0 20 69 6e 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a   inserting blob.
352c0 20 20 2a 2a 20 6b 65 79 73 20 77 69 74 68 20 6e    ** keys with n
352d0 6f 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  o associated dat
352e0 61 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  a. If the cursor
352f0 20 77 61 73 20 6f 70 65 6e 65 64 20 65 78 70 65   was opened expe
35300 63 74 69 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e  cting an.  ** in
35310 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 20  tkey table, the 
35320 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65  caller should be
35330 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 65 67   inserting integ
35340 65 72 20 6b 65 79 73 20 77 69 74 68 20 61 0a 20  er keys with a. 
35350 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f   ** blob of asso
35360 63 69 61 74 65 64 20 64 61 74 61 2e 20 20 2a 2f  ciated data.  */
35370 0a 20 20 61 73 73 65 72 74 28 20 28 70 4b 65 79  .  assert( (pKey
35380 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
35390 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
353a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
353b0 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 74   insert into a t
353c0 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e 76  able b-tree, inv
353d0 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
353e0 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f  blob .  ** curso
353f0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72  rs open on the r
35400 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ow being replace
35410 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68 69 73  d (assuming this
35420 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a 20 20   is a replace.  
35430 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69  ** operation - i
35440 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
35450 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
35460 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66  no-op).  */.  if
35470 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  ( pCur->pKeyInfo
35480 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  ==0 ){.    inval
35490 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
354a0 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67  sors(p, pCur->pg
354b0 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30 29  noRoot, nKey, 0)
354c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
354d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
354e0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 61  R_FAULT ){.    a
354f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
35500 70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  p!=SQLITE_OK );.
35510 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
35520 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >skip;.  }..  /*
35530 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
35540 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
35550 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
35560 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a   this table..  *
35570 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63  *.  ** In some c
35580 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74  ases, the call t
35590 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  o btreeMoveto() 
355a0 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70  below is a no-op
355b0 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70  . For.  ** examp
355c0 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69  le, when inserti
355d0 6e 67 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74  ng data into a t
355e0 61 62 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67  able with auto-g
355f0 65 6e 65 72 61 74 65 64 20 69 6e 74 65 67 65 72  enerated integer
35600 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20  .  ** keys, the 
35610 56 44 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b  VDBE layer invok
35620 65 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  es sqlite3BtreeL
35630 61 73 74 28 29 20 74 6f 20 66 69 67 75 72 65 20  ast() to figure 
35640 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  out the .  ** in
35650 74 65 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65  teger key to use
35660 2e 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20  . It then calls 
35670 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
35680 20 61 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74   actually insert
35690 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20   the .  ** data 
356a0 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20  into the intkey 
356b0 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20  B-Tree. In this 
356c0 63 61 73 65 20 62 74 72 65 65 4d 6f 76 65 74 6f  case btreeMoveto
356d0 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20  () recognizes.  
356e0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
356f0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 77 68  or is already wh
35700 65 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  ere it needs to 
35710 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77  be and returns w
35720 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e  ithout.  ** doin
35730 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61  g any work. To a
35740 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20 74  void thwarting t
35750 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
35760 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ns, it is import
35770 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  ant.  ** not to 
35780 63 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f 72  clear the cursor
35790 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   here..  */.  if
357a0 28 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  (.    SQLITE_OK!
357b0 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
357c0 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
357d0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
357e0 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26 0a 20 20  ) || (!loc &&.  
357f0 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
35800 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
35810 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  Cur, pKey, nKey,
35820 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f   appendBias, &lo
35830 63 29 29 0a 20 20 29 29 7b 0a 20 20 20 20 72 65  c)).  )){.    re
35840 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
35850 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
35860 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
35870 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61  D || (pCur->eSta
35880 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
35890 49 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20  ID && loc) );.. 
358a0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
358b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
358c0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
358d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e  age->intKey || n
358e0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
358f0 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
35900 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || !pPage->intKe
35910 79 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  y );..  TRACE(("
35920 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
35930 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
35940 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
35950 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
35960 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
35970 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
35980 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
35990 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
359a0 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
359b0 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
359c0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
359d0 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  ;.  allocateTemp
359e0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65  Space(pBt);.  ne
359f0 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d  wCell = pBt->pTm
35a00 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65  pSpace;.  if( ne
35a10 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
35a20 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
35a30 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
35a40 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
35a50 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
35a60 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72  ata, nData, nZer
35a70 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66  o, &szNew);.  if
35a80 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
35a90 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74  insert;.  assert
35aa0 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a  ( szNew==cellSiz
35ab0 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43  ePtr(pPage, newC
35ac0 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
35ad0 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c  ( szNew<=MX_CELL
35ae0 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
35af0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
35b00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
35b10 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a    if( loc==0 ){.
35b20 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20      u16 szOld;. 
35b30 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
35b40 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
35b50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35b60 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
35b70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
35b80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67  f( rc ){.      g
35b90 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
35ba0 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c      }.    oldCel
35bb0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
35bc0 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66  ge, idx);.    if
35bd0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
35be0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e  {.      memcpy(n
35bf0 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c  ewCell, oldCell,
35c00 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   4);.    }.    s
35c10 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50  zOld = cellSizeP
35c20 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  tr(pPage, oldCel
35c30 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  l);.    rc = cle
35c40 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c  arCell(pPage, ol
35c50 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  dCell);.    if( 
35c60 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
35c70 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 64  sert;.    rc = d
35c80 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
35c90 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20  dx, szOld);.    
35ca0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35cb0 4b 20 29 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f  K ) {.      goto
35cc0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
35cd0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c   }.  }else if( l
35ce0 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  oc<0 && pPage->n
35cf0 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73  Cell>0 ){.    as
35d00 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
35d10 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b  f );.    idx = +
35d20 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
35d30 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 65 6c  r->iPage];.  }el
35d40 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
35d50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
35d60 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74   }.  rc = insert
35d70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
35d80 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
35d90 20 30 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74   0, 0);.  assert
35da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35db0 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  || pPage->nCell>
35dc0 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  0 || pPage->nOve
35dd0 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a  rflow>0 );..  /*
35de0 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73   If no error has
35df0 20 6f 63 63 75 72 65 64 20 61 6e 64 20 70 50 61   occured and pPa
35e00 67 65 20 68 61 73 20 61 6e 20 6f 76 65 72 66 6c  ge has an overfl
35e10 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c 20 62 61  ow cell, call ba
35e20 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a 20 74 6f  lance() .  ** to
35e30 20 72 65 64 69 73 74 72 69 62 75 74 65 20 74 68   redistribute th
35e40 65 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74  e cells within t
35e50 68 65 20 74 72 65 65 2e 20 53 69 6e 63 65 20 62  he tree. Since b
35e60 61 6c 61 6e 63 65 28 29 20 6d 61 79 20 6d 6f 76  alance() may mov
35e70 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  e.  ** the curso
35e80 72 2c 20 7a 65 72 6f 20 74 68 65 20 42 74 43 75  r, zero the BtCu
35e90 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20  rsor.info.nSize 
35ea0 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 76 61 6c  and BtCursor.val
35eb0 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76 61 72 69  idNKey.  ** vari
35ec0 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
35ed0 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
35ee0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6c  ns of SQLite cal
35ef0 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29  led moveToRoot()
35f00 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 75 72   to move the cur
35f10 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f  sor.  ** back to
35f20 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 61   the root page a
35f30 73 20 62 61 6c 61 6e 63 65 28 29 20 75 73 65 64  s balance() used
35f40 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74   to invalidate t
35f50 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
35f60 20 6f 66 20 42 74 43 75 72 73 6f 72 2e 61 70 50   of BtCursor.apP
35f70 61 67 65 5b 5d 20 61 6e 64 20 42 74 43 75 72 73  age[] and BtCurs
35f80 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 49 6e 73 74  or.aiIdx[]. Inst
35f90 65 61 64 20 6f 66 20 64 6f 69 6e 67 20 74 68 61  ead of doing tha
35fa0 74 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  t,.  ** set the 
35fb0 63 75 72 73 6f 72 20 73 74 61 74 65 20 74 6f 20  cursor state to 
35fc0 22 69 6e 76 61 6c 69 64 22 2e 20 54 68 69 73 20  "invalid". This 
35fd0 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73  makes common ins
35fe0 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 0a 20  ert operations. 
35ff0 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 66 61 73   ** slightly fas
36000 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ter..  **.  ** T
36010 68 65 72 65 20 69 73 20 61 20 73 75 62 74 6c 65  here is a subtle
36020 20 62 75 74 20 69 6d 70 6f 72 74 61 6e 74 20 6f   but important o
36030 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68 65 72 65  ptimization here
36040 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e 73 65 72   too. When inser
36050 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c 74 69 70  ting.  ** multip
36060 6c 65 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20  le records into 
36070 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  an intkey b-tree
36080 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
36090 63 75 72 73 6f 72 20 28 61 73 20 63 61 6e 0a 20  cursor (as can. 
360a0 20 2a 2a 20 68 61 70 70 65 6e 20 77 68 69 6c 65   ** happen while
360b0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 22   processing an "
360c0 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20  INSERT INTO ... 
360d0 53 45 4c 45 43 54 22 20 73 74 61 74 65 6d 65 6e  SELECT" statemen
360e0 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 61  t), it.  ** is a
360f0 64 76 61 6e 74 61 67 65 6f 75 73 20 74 6f 20 6c  dvantageous to l
36100 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  eave the cursor 
36110 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
36120 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 0a 20 20  last entry in.  
36130 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 69 66  ** the b-tree if
36140 20 70 6f 73 73 69 62 6c 65 2e 20 49 66 20 74 68   possible. If th
36150 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
36160 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
36170 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e 74 72 79   last.  ** entry
36180 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 61   in the table, a
36190 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  nd the next row 
361a0 69 6e 73 65 72 74 65 64 20 68 61 73 20 61 6e 20  inserted has an 
361b0 69 6e 74 65 67 65 72 20 6b 65 79 0a 20 20 2a 2a  integer key.  **
361c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
361d0 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69 6e   largest existin
361e0 67 20 6b 65 79 2c 20 69 74 20 69 73 20 70 6f 73  g key, it is pos
361f0 73 69 62 6c 65 20 74 6f 20 69 6e 73 65 72 74 20  sible to insert 
36200 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 77 69 74  the.  ** row wit
36210 68 6f 75 74 20 73 65 65 6b 69 6e 67 20 74 68 65  hout seeking the
36220 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20 63 61   cursor. This ca
36230 6e 20 62 65 20 61 20 62 69 67 20 70 65 72 66 6f  n be a big perfo
36240 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20  rmance boost..  
36250 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  */.  pCur->info.
36260 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
36270 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
36280 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
36290 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
362a0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
362b0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
362c0 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 75 73  ur);..    /* Mus
362d0 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 65  t make sure nOve
362e0 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20 74  rflow is reset t
362f0 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 74  o zero even if t
36300 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20 20 20  he balance().   
36310 20 2a 2a 20 66 61 69 6c 73 2e 20 49 6e 74 65 72   ** fails. Inter
36320 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
36330 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  re corruption wi
36340 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72 77  ll result otherw
36350 69 73 65 2e 20 0a 20 20 20 20 2a 2a 20 41 6c 73  ise. .    ** Als
36360 6f 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  o, set the curso
36370 72 20 73 74 61 74 65 20 74 6f 20 69 6e 76 61 6c  r state to inval
36380 69 64 2e 20 54 68 69 73 20 73 74 6f 70 73 20 73  id. This stops s
36390 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
363a0 6e 28 29 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  n().    ** from 
363b0 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 74  trying to save t
363c0 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
363d0 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ion of the curso
363e0 72 2e 20 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  r.  */.    pCur-
363f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
36400 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  age]->nOverflow 
36410 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  = 0;.    pCur->e
36420 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
36430 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 61 73  NVALID;.  }.  as
36440 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
36450 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
36460 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
36470 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20  ..end_insert:.  
36480 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36490 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65  .** Delete the e
364a0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75  ntry that the cu
364b0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
364c0 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72   to.  The cursor
364d0 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
364e0 74 69 6e 67 20 61 74 20 61 20 61 72 62 69 74 72  ting at a arbitr
364f0 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  ary location..*/
36500 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
36510 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
36520 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
36530 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
36540 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
36550 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
36560 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
36570 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
36580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36590 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
365a0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
365b0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
365c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
365d0 61 67 65 20 74 6f 20 64 65 6c 65 74 65 20 63 65  age to delete ce
365e0 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73  ll from */.  uns
365f0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
36600 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
36610 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
36620 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
36630 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 49 64 78  /.  int iCellIdx
36640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36650 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
36660 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20 64 65 6c  x of cell to del
36670 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ete */.  int iCe
36680 6c 6c 44 65 70 74 68 3b 20 20 20 20 20 20 20 20  llDepth;        
36690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
366a0 20 44 65 70 74 68 20 6f 66 20 6e 6f 64 65 20 63   Depth of node c
366b0 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c 6c 20  ontaining pCell 
366c0 2a 2f 20 0a 0a 20 20 61 73 73 65 72 74 28 20 63  */ ..  assert( c
366d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
366e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
366f0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
36700 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
36710 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
36720 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
36730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
36740 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 61 73  ->wrFlag );.  as
36750 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
36760 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
36770 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
36780 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21   pCur->pKeyInfo!
36790 3d 30 2c 20 32 29 20 29 3b 0a 20 20 61 73 73 65  =0, 2) );.  asse
367a0 72 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66  rt( !hasReadConf
367b0 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d 3e 70  licts(p, pCur->p
367c0 67 6e 6f 52 6f 6f 74 29 20 29 3b 0a 0a 20 20 69  gnoRoot) );..  i
367d0 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61  f( NEVER(pCur->a
367e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
367f0 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]>=pCur->apPage[
36800 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
36810 65 6c 6c 29 20 0a 20 20 20 7c 7c 20 4e 45 56 45  ell) .   || NEVE
36820 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  R(pCur->eState!=
36830 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 20 20  CURSOR_VALID).  
36840 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
36850 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
36860 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 67 6f  Something has go
36870 6e 65 20 61 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a  ne awry. */.  }.
36880 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
36890 20 61 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74   a delete operat
368a0 69 6f 6e 20 74 6f 20 72 65 6d 6f 76 65 20 61 20  ion to remove a 
368b0 72 6f 77 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  row from a table
368c0 20 62 2d 74 72 65 65 2c 0a 20 20 2a 2a 20 69 6e   b-tree,.  ** in
368d0 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
368e0 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
368f0 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62 65  en on the row be
36900 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 20 2a 2f  ing deleted.  */
36910 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4b 65  .  if( pCur->pKe
36920 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  yInfo==0 ){.    
36930 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
36940 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 70 43 75  obCursors(p, pCu
36950 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
36960 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 29  r->info.nKey, 0)
36970 3b 0a 20 20 7d 0a 0a 20 20 69 43 65 6c 6c 44 65  ;.  }..  iCellDe
36980 70 74 68 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  pth = pCur->iPag
36990 65 3b 0a 20 20 69 43 65 6c 6c 49 64 78 20 3d 20  e;.  iCellIdx = 
369a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 43 65 6c  pCur->aiIdx[iCel
369b0 6c 44 65 70 74 68 5d 3b 0a 20 20 70 50 61 67 65  lDepth];.  pPage
369c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
369d0 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70  iCellDepth];.  p
369e0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
369f0 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 29  pPage, iCellIdx)
36a00 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
36a10 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
36a20 68 65 20 65 6e 74 72 79 20 74 6f 20 64 65 6c 65  he entry to dele
36a30 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  te is not a leaf
36a40 20 70 61 67 65 2c 20 6d 6f 76 65 0a 20 20 2a 2a   page, move.  **
36a50 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
36a60 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79  he largest entry
36a70 20 69 6e 20 74 68 65 20 74 72 65 65 20 74 68 61   in the tree tha
36a80 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
36a90 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79  n.  ** the entry
36aa0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20   being deleted. 
36ab0 54 68 69 73 20 63 65 6c 6c 20 77 69 6c 6c 20 72  This cell will r
36ac0 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c 6c 20  eplace the cell 
36ad0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 0a 20 20  being deleted.  
36ae0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ** from the inte
36af0 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 65 20 27  rnal node. The '
36b00 70 72 65 76 69 6f 75 73 27 20 65 6e 74 72 79 20  previous' entry 
36b10 69 73 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  is used for this
36b20 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6f 66   instead.  ** of
36b30 20 74 68 65 20 27 6e 65 78 74 27 20 65 6e 74 72   the 'next' entr
36b40 79 2c 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  y, as the previo
36b50 75 73 20 65 6e 74 72 79 20 69 73 20 61 6c 77 61  us entry is alwa
36b60 79 73 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  ys a part of the
36b70 0a 20 20 2a 2a 20 73 75 62 2d 74 72 65 65 20 68  .  ** sub-tree h
36b80 65 61 64 65 64 20 62 79 20 74 68 65 20 63 68 69  eaded by the chi
36b90 6c 64 20 70 61 67 65 20 6f 66 20 74 68 65 20 63  ld page of the c
36ba0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
36bb0 64 2e 20 54 68 69 73 20 6d 61 6b 65 73 0a 20 20  d. This makes.  
36bc0 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  ** balancing the
36bd0 20 74 72 65 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   tree following 
36be0 74 68 65 20 64 65 6c 65 74 65 20 6f 70 65 72 61  the delete opera
36bf0 74 69 6f 6e 20 65 61 73 69 65 72 2e 20 20 2a 2f  tion easier.  */
36c00 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
36c10 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  eaf ){.    int n
36c20 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 66 28 20  otUsed;.    if( 
36c30 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
36c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
36c50 76 69 6f 75 73 28 70 43 75 72 2c 20 26 6e 6f 74  vious(pCur, &not
36c60 55 73 65 64 29 29 20 29 7b 0a 20 20 20 20 20 20  Used)) ){.      
36c70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36c80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
36c90 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
36ca0 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
36cb0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
36cc0 74 61 62 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a  table before.  *
36cd0 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d 6f 64  * making any mod
36ce0 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 6b 65  ifications. Make
36cf0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
36d00 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74  ning the entry t
36d10 6f 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c 65 74  o be .  ** delet
36d20 65 64 20 77 72 69 74 61 62 6c 65 2e 20 54 68 65  ed writable. The
36d30 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 65 72 66  n free any overf
36d40 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
36d50 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 20  ated with the . 
36d60 20 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 66 69   ** entry and fi
36d70 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74 68 65  nally remove the
36d80 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 66 72 6f   cell itself fro
36d90 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  m within the pag
36da0 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  e.  .  */.  rc =
36db0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
36dc0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
36dd0 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66  oot, pCur);.  if
36de0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36df0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
36e00 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
36e10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
36e20 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36e30 3b 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  ;.  rc = clearCe
36e40 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
36e50 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
36e60 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 64  urn rc;.  rc = d
36e70 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
36e80 43 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53 69 7a  CellIdx, cellSiz
36e90 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
36ea0 6c 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  l));.  if( rc ) 
36eb0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
36ec0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 64 65 6c   If the cell del
36ed0 65 74 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63  eted was not loc
36ee0 61 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70  ated on a leaf p
36ef0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
36f00 72 73 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75 72  rsor.  ** is cur
36f10 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
36f20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  to the largest e
36f30 6e 74 72 79 20 69 6e 20 74 68 65 20 73 75 62 2d  ntry in the sub-
36f40 74 72 65 65 20 68 65 61 64 65 64 0a 20 20 2a 2a  tree headed.  **
36f50 20 62 79 20 74 68 65 20 63 68 69 6c 64 2d 70 61   by the child-pa
36f60 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  ge of the cell t
36f70 68 61 74 20 77 61 73 20 6a 75 73 74 20 64 65 6c  hat was just del
36f80 65 74 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74  eted from an int
36f90 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e  ernal.  ** node.
36fa0 20 54 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   The cell from t
36fb0 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6e 65 65  he leaf node nee
36fc0 64 73 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 74  ds to be moved t
36fd0 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20  o the internal. 
36fe0 20 2a 2a 20 6e 6f 64 65 20 74 6f 20 72 65 70 6c   ** node to repl
36ff0 61 63 65 20 74 68 65 20 64 65 6c 65 74 65 64 20  ace the deleted 
37000 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69 66 28 20  cell.  */.  if( 
37010 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
37020 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65      MemPage *pLe
37030 61 66 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  af = pCur->apPag
37040 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
37050 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
37060 20 20 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72     Pgno n = pCur
37070 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65  ->apPage[iCellDe
37080 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  pth+1]->pgno;.  
37090 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
370a0 2a 70 54 6d 70 3b 0a 0a 20 20 20 20 70 43 65 6c  *pTmp;..    pCel
370b0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65  l = findCell(pLe
370c0 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c  af, pLeaf->nCell
370d0 2d 31 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  -1);.    nCell =
370e0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65   cellSizePtr(pLe
370f0 61 66 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  af, pCell);.    
37100 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f  assert( MX_CELL_
37110 53 49 5a 45 28 70 42 74 29 3e 3d 6e 43 65 6c 6c  SIZE(pBt)>=nCell
37120 20 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f 63 61 74   );..    allocat
37130 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
37140 0a 20 20 20 20 70 54 6d 70 20 3d 20 70 42 74 2d  .    pTmp = pBt-
37150 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 20  >pTmpSpace;..   
37160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37170 65 72 57 72 69 74 65 28 70 4c 65 61 66 2d 3e 70  erWrite(pLeaf->p
37180 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
37190 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
371a0 0a 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74  .    rc = insert
371b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
371c0 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e  lIdx, pCell-4, n
371d0 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 29  Cell+4, pTmp, n)
371e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
371f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
37200 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61   = dropCell(pLea
37210 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d  f, pLeaf->nCell-
37220 31 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 69  1, nCell);.    i
37230 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37240 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c  c;.  }..  /* Bal
37250 61 6e 63 65 20 74 68 65 20 74 72 65 65 2e 20 49  ance the tree. I
37260 66 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65  f the entry dele
37270 74 65 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ted was located 
37280 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a  on a leaf page,.
37290 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75    ** then the cu
372a0 72 73 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74  rsor still point
372b0 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20  s to that page. 
372c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
372d0 20 66 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c   first.  ** call
372e0 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65   to balance() re
372f0 70 61 69 72 73 20 74 68 65 20 74 72 65 65 2c 20  pairs the tree, 
37300 61 6e 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20  and the if(...) 
37310 63 6f 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a  condition is.  *
37320 2a 20 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20  * never true..  
37330 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  **.  ** Otherwis
37340 65 2c 20 69 66 20 74 68 65 20 65 6e 74 72 79 20  e, if the entry 
37350 64 65 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61  deleted was on a
37360 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  n internal node 
37370 70 61 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  page, then.  ** 
37380 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
37390 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
373a0 65 20 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63  e from which a c
373b0 65 6c 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ell was removed 
373c0 74 6f 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20  to.  ** replace 
373d0 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64  the cell deleted
373e0 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
373f0 61 6c 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  al node. This is
37400 20 73 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74   slightly.  ** t
37410 72 69 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61  ricky as the lea
37420 66 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e  f node may be un
37430 64 65 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65  derfull, and the
37440 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d   internal node m
37450 61 79 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65  ay.  ** be eithe
37460 72 20 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66  r under or overf
37470 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
37480 65 20 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63  e run the balanc
37490 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20  ing algorithm.  
374a0 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e  ** on the leaf n
374b0 6f 64 65 20 66 69 72 73 74 2e 20 49 66 20 74 68  ode first. If th
374c0 65 20 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65  e balance procee
374d0 64 73 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70  ds far enough up
374e0 20 74 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74   the.  ** tree t
374f0 68 61 74 20 77 65 20 63 61 6e 20 62 65 20 73 75  hat we can be su
37500 72 65 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62  re that any prob
37510 6c 65 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72  lem in the inter
37520 6e 61 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a  nal node has.  *
37530 2a 20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64  * been corrected
37540 2c 20 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65  , so be it. Othe
37550 72 77 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c  rwise, after bal
37560 61 6e 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20  ancing the leaf 
37570 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20  node,.  ** walk 
37580 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68  the cursor up th
37590 65 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e  e tree to the in
375a0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20  ternal node and 
375b0 62 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20  balance it as . 
375c0 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   ** well.  */.  
375d0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
375e0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
375f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d  LITE_OK && pCur-
37600 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74  >iPage>iCellDept
37610 68 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  h ){.    while( 
37620 70 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c  pCur->iPage>iCel
37630 6c 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  lDepth ){.      
37640 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
37650 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
37660 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a  Page--]);.    }.
37670 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
37680 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
37690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
376a0 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
376b0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
376c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
376d0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
376e0 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
376f0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
37700 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
37710 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
37720 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
37730 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
37740 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
37750 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
37760 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
37770 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
37780 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
37790 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
377a0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
377b0 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
377c0 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
377d0 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
377e0 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
377f0 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
37800 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
37810 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
37820 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
37830 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
37840 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
37850 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
37860 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74   indices.*/.stat
37870 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61  ic int btreeCrea
37880 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
37890 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
378a0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
378b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
378c0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
378d0 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
378e0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
378f0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
37900 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37910 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37920 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
37930 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
37940 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
37950 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
37960 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
37970 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
37980 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
37990 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
379a0 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
379b0 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
379c0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
379d0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  n rc;.  }.#else.
379e0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
379f0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
37a00 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
37a10 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
37a20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
37a30 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
37a40 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
37a50 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
37a60 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
37a70 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
37a80 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77  * Creating a new
37a90 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61   table may proba
37aa0 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  bly require movi
37ab0 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64  ng an existing d
37ac0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74  atabase.    ** t
37ad0 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
37ae0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72  the new tables r
37af0 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73  oot page. In cas
37b00 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e  e this page turn
37b10 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  s.    ** out to 
37b20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
37b30 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20  age, delete all 
37b40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61  overflow page-ma
37b50 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20  p caches.    ** 
37b60 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72  held by open cur
37b70 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sors..    */.   
37b80 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
37b90 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
37ba0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
37bb0 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
37bc0 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
37bd0 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
37be0 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
37bf0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
37c00 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
37c10 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
37c20 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
37c30 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
37c40 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
37c50 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
37c60 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
37c70 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
37c80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
37c90 74 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c  tMeta(p, BTREE_L
37ca0 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45  ARGEST_ROOT_PAGE
37cb0 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  , &pgnoRoot);.  
37cc0 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20    pgnoRoot++;.. 
37cd0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
37ce0 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  ot-page may not 
37cf0 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  be allocated on 
37d00 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
37d10 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ge, or the.    *
37d20 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70  * PENDING_BYTE p
37d30 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
37d40 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d  while( pgnoRoot=
37d50 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
37d60 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
37d70 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
37d80 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
37d90 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
37da0 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
37db0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
37dc0 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
37dd0 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
37de0 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
37df0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
37e00 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
37e10 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
37e20 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
37e30 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
37e40 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
37e50 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
37e60 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
37e70 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
37e80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
37e90 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
37ea0 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d  age(pBt, &pPageM
37eb0 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20  ove, &pgnoMove, 
37ec0 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20  pgnoRoot, 1);.  
37ed0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37ee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
37ef0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
37f00 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21     if( pgnoMove!
37f10 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  =pgnoRoot ){.   
37f20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69     /* pgnoRoot i
37f30 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
37f40 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
37f50 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f   the root-page o
37f60 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  f.      ** the n
37f70 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69  ew table (assumi
37f80 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  ng an error did 
37f90 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20  not occur). But 
37fa0 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a  we were.      **
37fb0 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d   allocated pgnoM
37fc0 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64  ove. If required
37fd0 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73   (i.e. if it was
37fe0 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20   not allocated. 
37ff0 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e       ** by exten
38000 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20  ding the file), 
38010 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
38020 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e   at position pgn
38030 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69  oMove.      ** i
38040 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61  s already journa
38050 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
38060 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
38070 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
38080 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e;..      releas
38090 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29  ePage(pPageMove)
380a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ;..      /* Move
380b0 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
380c0 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  tly at pgnoRoot 
380d0 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a  to pgnoMove. */.
380e0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
380f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
38100 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
38110 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
38120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38130 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
38140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
38150 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
38160 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54  t, pgnoRoot, &eT
38170 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
38180 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
38190 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
381a0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
381b0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
381c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
381d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
381e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
381f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
38200 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
38210 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
38220 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
38230 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
38240 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
38250 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
38260 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
38270 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
38280 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
38290 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
382a0 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
382b0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
382c0 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
382d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
382e0 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
382f0 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
38300 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
38310 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
38320 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
38330 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
38340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
38350 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
38360 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
38370 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
38380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
383a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
383b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
383c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
383d0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
383e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
383f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
38400 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
38410 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
38420 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
38430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38440 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f   pRoot = pPageMo
38450 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20  ve;.    } ..    
38460 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 6f  /* Update the po
38470 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65  inter-map and me
38480 74 61 2d 64 61 74 61 20 77 69 74 68 20 74 68 65  ta-data with the
38490 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e   new root-page n
384a0 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63  umber. */.    rc
384b0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
384c0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d  ,