/ Hex Artifact Content
Login

Artifact 805ca9606405ae80fe1afa001e7054f13ecb6046:


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 35 37 34 20 32 30 30 39 2f 30  c,v 1.574 2009/0
0190: 33 2f 31 37 20 32 32 3a 33 33 3a 30 31 20 64 72  3/17 22:33:01 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20 54 72  eTrace=0;  /* 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 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0530: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0540: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0550: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0560: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0570: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0580: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
0590: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
05a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
05b0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
05c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
05d0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
05e0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
05f0: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0600: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0610: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0620: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0630: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0640: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0650: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0660: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0670: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0680: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0690: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
06a0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
06b0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
06c0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
06d0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
06e0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
06f0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0700: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0710: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0720: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0730: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0740: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0750: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0760: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
0770: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0780: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
0790: 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43  nt checkForReadC
07a0: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 2a 2c  onflicts(Btree*,
07b0: 20 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f 72 2a   Pgno, BtCursor*
07c0: 2c 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64 65 66  , i64);...#ifdef
07d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
07e0: 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20  RED_CACHE.  /*. 
07f0: 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   ** The function
0800: 73 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  s querySharedCac
0810: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 73  heTableLock(), s
0820: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
0830: 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a 20 61  leLock(),.  ** a
0840: 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65  nd clearAllShare
0850: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
0860: 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75 6c 61  ().  ** manipula
0870: 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  te entries in th
0880: 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b  e BtShared.pLock
0890: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75 73 65   linked list use
08a0: 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a 2a 20  d to store.  ** 
08b0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 74 61 62  shared-cache tab
08c0: 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73 2e 20  le level locks. 
08d0: 49 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 69  If the library i
08e0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
08f0: 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  the.  ** shared-
0900: 63 61 63 68 65 20 66 65 61 74 75 72 65 20 64 69  cache feature di
0910: 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
0920: 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  re is only ever 
0930: 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20 6f 66  one user.  ** of
0940: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
0950: 74 72 75 63 74 75 72 65 20 61 6e 64 20 73 6f 20  tructure and so 
0960: 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69 73 20  this locking is 
0970: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 0a  not necessary. .
0980: 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20 74    ** So define t
0990: 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65 64 20  he lock related 
09a0: 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e 6f 2d  functions as no-
09b0: 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66  ops..  */.  #def
09c0: 69 6e 65 20 71 75 65 72 79 53 68 61 72 65 64 43  ine querySharedC
09d0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c  acheTableLock(a,
09e0: 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  b,c) SQLITE_OK. 
09f0: 20 23 64 65 66 69 6e 65 20 73 65 74 53 68 61 72   #define setShar
0a00: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0a10: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0a20: 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c 65 61  K.  #define clea
0a30: 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
0a40: 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 23 65 6e  ableLocks(a).#en
0a50: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
0a60: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0a70: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72  CACHE./*.** Quer
0a80: 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65  y to see if btre
0a90: 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f  e handle p may o
0aa0: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
0ab0: 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28  type eLock .** (
0ac0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
0ad0: 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20  TE_LOCK) on the 
0ae0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
0af0: 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72  page iTab. Retur
0b00: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  n.** SQLITE_OK i
0b10: 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62  f the lock may b
0b20: 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63  e obtained (by c
0b30: 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61  alling.** setSha
0b40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0b50: 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f  k()), or SQLITE_
0b60: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
0b70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
0b80: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0b90: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
0ba0: 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65   Pgno iTab, u8 e
0bb0: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
0bc0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
0bd0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
0be0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
0bf0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
0c00: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
0c10: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
0c20: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
0c30: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
0c40: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
0c50: 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
0c60: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
0c70: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
0c80: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
0c90: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
0ca0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
0cb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
0cc0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
0cd0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
0ce0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
0cf0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
0d00: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
0d10: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
0d20: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
0d30: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
0d40: 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73  er!=p && pBt->is
0d50: 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
0d60: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
0d70: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
0d80: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
0d90: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
0da0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
0db0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
0dc0: 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20   /* This (along 
0dd0: 77 69 74 68 20 73 65 74 53 68 61 72 65 64 43 61  with setSharedCa
0de0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 20  cheTableLock()) 
0df0: 69 73 20 77 68 65 72 65 0a 20 20 2a 2a 20 74 68  is where.  ** th
0e00: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
0e10: 64 20 66 6c 61 67 20 69 73 20 64 65 61 6c 74 20  d flag is dealt 
0e20: 77 69 74 68 2e 0a 20 20 2a 2a 20 49 66 20 74 68  with..  ** If th
0e30: 65 20 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72  e caller is quer
0e40: 79 69 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d  ying for a read-
0e50: 6c 6f 63 6b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  lock on any tabl
0e60: 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 74 68 61  e.  ** other tha
0e70: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
0e80: 74 65 72 20 74 61 62 6c 65 20 28 74 61 62 6c 65  ter table (table
0e90: 20 31 29 20 61 6e 64 20 69 66 20 74 68 65 20 52   1) and if the R
0ea0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 0a 20  eadUncommitted. 
0eb0: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
0ec0: 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 67   then the lock g
0ed0: 72 61 6e 74 65 64 20 65 76 65 6e 20 69 66 20 74  ranted even if t
0ee0: 68 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c  here are write-l
0ef0: 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ocks.  ** on the
0f00: 20 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69   table. If a wri
0f10: 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  te-lock is reque
0f20: 73 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e  sted, the ReadUn
0f30: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20  committed flag. 
0f40: 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69   ** is not consi
0f50: 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dered..  **.  **
0f60: 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20 73 65 74   In function set
0f70: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0f80: 4c 6f 63 6b 28 29 2c 20 69 66 20 61 20 72 65 61  Lock(), if a rea
0f90: 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64  d-lock is demand
0fa0: 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ed and the .  **
0fb0: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0fc0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f   flag is set, no
0fd0: 20 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20   entry is added 
0fe0: 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73  to the locks lis
0ff0: 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65  t .  ** (BtShare
1000: 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20  d.pLock)..  **. 
1010: 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65   ** To summarize
1020: 3a 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63  : If the ReadUnc
1030: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
1040: 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20   set, then read 
1050: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 6f 6e 20  cursors.  ** on 
1060: 6e 6f 6e 2d 73 63 68 65 6d 61 20 74 61 62 6c 65  non-schema table
1070: 73 20 64 6f 20 6e 6f 74 20 63 72 65 61 74 65 20  s do not create 
1080: 6f 72 20 72 65 73 70 65 63 74 20 74 61 62 6c 65  or respect table
1090: 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b   locks. The lock
10a0: 69 6e 67 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75  ing.  ** procedu
10b0: 72 65 20 66 6f 72 20 61 20 77 72 69 74 65 2d 63  re for a write-c
10c0: 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63  ursor does not c
10d0: 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
10e0: 28 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 64 62  ( .    0==(p->db
10f0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
1100: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20  eadUncommitted) 
1110: 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d 57  || .    eLock==W
1120: 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20  RITE_LOCK ||.   
1130: 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52 4f   iTab==MASTER_RO
1140: 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  OT.  ){.    for(
1150: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1160: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1170: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1180: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
1190: 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74 65  Btree!=p && pIte
11a0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  r->iTable==iTab 
11b0: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
11c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f  Iter->eLock!=eLo
11d0: 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45 41  ck || eLock!=REA
11e0: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20  D_LOCK) ){.     
11f0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1200: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1210: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
1220: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  ->db);.        i
1230: 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  f( eLock==WRITE_
1240: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
1250: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74    assert( p==pBt
1260: 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1270: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
1280: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
1290: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
12a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
12b0: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
12c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12e0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
12f0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
1300: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
1310: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1320: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1330: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
1340: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
1350: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1360: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
1370: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
1380: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
1390: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
13a0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
13b0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
13c0: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
13d0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
13e0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
13f0: 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20  e lock is added 
1400: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51  successfully. SQ
1410: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
1420: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61   SQLITE_NOMEM ma
1430: 79 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e  y also be return
1440: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1450: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
1460: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
1470: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
1480: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1490: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14a0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
14b0: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
14c0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
14d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
14e0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
14f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1500: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1510: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
1520: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1530: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
1540: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
1550: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
1560: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
1570: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
1580: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
1590: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15a0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
15b0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
15c0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
15d0: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
15e0: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
15f0: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d   /* If the read-
1600: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1610: 20 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65   is set and a re
1620: 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ad-lock is reque
1630: 73 74 65 64 20 6f 6e 0a 20 20 2a 2a 20 61 20 6e  sted on.  ** a n
1640: 6f 6e 2d 73 63 68 65 6d 61 20 74 61 62 6c 65 2c  on-schema table,
1650: 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
1660: 73 20 61 6c 77 61 79 73 20 67 72 61 6e 74 65 64  s always granted
1670: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 0a  .  Return early.
1680: 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 61 64 64    ** without add
1690: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
16a0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
16b0: 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a  ck list. See.  *
16c0: 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e  * comment in fun
16d0: 63 74 69 6f 6e 20 71 75 65 72 79 53 68 61 72 65  ction queryShare
16e0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
16f0: 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 0a  ) for more info.
1700: 20 20 2a 2a 20 6f 6e 20 68 61 6e 64 6c 69 6e 67    ** on handling
1710: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
1720: 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a  tted flag..  */.
1730: 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64    if( .    (p->d
1740: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1750: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1760: 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d   && .    (eLock=
1770: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20  =READ_LOCK) &&. 
1780: 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45     iTable!=MASTE
1790: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
17a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
17c0: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
17d0: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
17e0: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
17f0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
1800: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1810: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1820: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1830: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
1840: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
1850: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
1860: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
1870: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
1880: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1890: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
18a0: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
18b0: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
18c0: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
18d0: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
18e0: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
18f0: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
1900: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
1910: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
1920: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1930: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
1940: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
1950: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
1960: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
1970: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
1980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1990: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
19a0: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
19b0: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
19c0: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
19d0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
19e0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
19f0: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
1a00: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
1a10: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
1a20: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
1a30: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
1a40: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
1a50: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
1a60: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
1a70: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
1a80: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
1a90: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
1aa0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
1ab0: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
1ac0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
1ad0: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
1ae0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1af0: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
1b00: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
1b10: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
1b20: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
1b30: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
1b40: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1b50: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1b60: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
1b70: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
1b80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b90: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1ba0: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
1bb0: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
1bc0: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
1bd0: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
1be0: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
1bf0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1c00: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
1c10: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
1c20: 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e p..*/.static v
1c30: 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72  oid clearAllShar
1c40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1c50: 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  s(Btree *p){.  B
1c60: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c70: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
1c80: 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d  **ppIter = &pBt-
1c90: 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72  >pLock;..  asser
1ca0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1cb0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1cc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61    assert( p->sha
1cd0: 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49  rable || 0==*ppI
1ce0: 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  ter );..  while(
1cf0: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
1d00: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
1d10: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
1d20: 65 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c  ert( pBt->isExcl
1d30: 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d  usive==0 || pBt-
1d40: 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d  >pWriter==pLock-
1d50: 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 69  >pBtree );.    i
1d60: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
1d70: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
1d80: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
1d90: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1da0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
1db0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dc0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
1dd0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1de0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
1df0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
1e00: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
1e10: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
1e20: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
1e30: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
1e40: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
1e50: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
1e60: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
1e70: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1e80: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1e90: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
1ea0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1eb0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e  called when conn
1ec0: 65 63 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63  ection p is conc
1ed0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
1ee0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1ef0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
1f00: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
1f10: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
1f20: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
1f30: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
1f40: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
1f50: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
1f60: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
1f70: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
1f80: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
1f90: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
1fa0: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
1fb0: 2a 20 73 65 74 20 74 68 65 20 69 73 50 65 6e 64  * set the isPend
1fc0: 69 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20  ing flag to 0.. 
1fd0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1fe0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72  there is not cur
1ff0: 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c  rently a writer,
2000: 20 74 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69   then BtShared.i
2010: 73 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20  sPending must.  
2020: 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72    ** be zero alr
2030: 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65  eady. So this ne
2040: 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c  xt line is harml
2050: 65 73 73 20 69 6e 20 74 68 61 74 20 63 61 73 65  ess in that case
2060: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74  ..    */.    pBt
2070: 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b  ->isPending = 0;
2080: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
2090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
20a0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74  RED_CACHE */..st
20b0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
20c0: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
20d0: 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61  Page);  /* Forwa
20e0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
20f0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
2100: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f  at the cursor ho
2110: 6c 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  lds a mutex on t
2120: 68 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  he BtShared.*/.#
2130: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
2140: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
2150: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
2160: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
2170: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2180: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
2190: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  x);.}.#endif...#
21a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21b0: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
21c0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
21d0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
21e0: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 63 75  ist cache for cu
21f0: 72 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e  rsor pCur, if an
2200: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
2210: 64 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  d invalidateOver
2220: 66 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72 73  flowCache(BtCurs
2230: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
2240: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2250: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2260: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2270: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
2280: 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
2290: 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w = 0;.}../*.** 
22a0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
22b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
22c0: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
22d0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
22e0: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
22f0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
2300: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
2310: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
2320: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
2330: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
2340: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
2350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2360: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2370: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
2380: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
2390: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
23a0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
23b0: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a  erflowCache(p);.
23c0: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64    }.}.#else.  #d
23d0: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
23e0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29  OverflowCache(x)
23f0: 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  .  #define inval
2400: 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
2410: 43 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a  Cache(x).#endif.
2420: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
2430: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
2440: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
2450: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
2460: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
2470: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
2480: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
2490: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
24a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
24b0: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
24c0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
24d0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
24e0: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
24f0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
2500: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
2510: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
2520: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
2530: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
2540: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
2550: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
2560: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
2570: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
2580: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
2590: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
25a0: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
25b0: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
25c0: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
25d0: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
25e0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
25f0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
2600: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
2610: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
2620: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
2630: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
2640: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
2650: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
2660: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
2670: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
2680: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
2690: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
26a0: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
26b0: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
26c0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
26d0: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
26e0: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
26f0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
2700: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
2710: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2720: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
2730: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
2740: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
2750: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
2760: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
2770: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
2780: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
2790: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
27a0: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
27b0: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
27c0: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
27d0: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
27e0: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
27f0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
2800: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
2810: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
2820: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
2830: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
2840: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
2850: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
2860: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
2870: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
2880: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
2890: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
28a0: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
28b0: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
28c0: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
28d0: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
28e0: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
28f0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
2900: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
2910: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
2920: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
2930: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
2940: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
2950: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
2960: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
2970: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
2980: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
2990: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
29a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
29b0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
29c0: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
29d0: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
29e0: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
29f0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
2a00: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
2a10: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
2a20: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
2a30: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
2a40: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
2a50: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
2a60: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
2a70: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74  2 above is ommit
2a80: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
2a90: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
2aa0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
2ab0: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
2ac0: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
2ad0: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
2ae0: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
2af0: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2b00: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
2b10: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2b20: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
2b30: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
2b40: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
2b50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b60: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
2b70: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
2b80: 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
2b90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ba0: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
2bb0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
2bc0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
2bd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2be0: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
2bf0: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
2c00: 76 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e  vecCreate((u32)n
2c10: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2c20: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
2c30: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  nt ){.        rc
2c40: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2c70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
2c80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
2c90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
2ca0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
2cb0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
2cc0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
2cd0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
2ce0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2cf0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
2d00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
2d10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
2d20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2d30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
2d40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
2d50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
2d60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
2d70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
2d80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
2d90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
2da0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
2db0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
2dc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
2dd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
2de0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
2df0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
2e00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
2e10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
2e20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
2e30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
2e40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
2e50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
2e60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
2e70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
2e80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
2e90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
2ea0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
2eb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
2ec0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
2ed0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
2ee0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
2ef0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
2f00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
2f10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
2f20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2f30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
2f40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
2f50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
2f60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
2f70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
2f80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
2f90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
2fa0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
2fb0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2fc0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
2fd0: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
2fe0: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
2ff0: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
3000: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
3010: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
3020: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74  QUIRESEEK..*/.st
3030: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
3040: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
3050: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
3060: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3070: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
3080: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
3090: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
30a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
30b0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
30c0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
30d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
30e0: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
30f0: 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a   &pCur->nKey);..
3100: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
3110: 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c  an intKey table,
3120: 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20   then the above 
3130: 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79  call to BtreeKey
3140: 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72  Size().  ** stor
3150: 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  es the integer k
3160: 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ey in pCur->nKey
3170: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
3180: 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a  his value is.  *
3190: 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  * all that is re
31a0: 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73  quired. Otherwis
31b0: 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f  e, if pCur is no
31c0: 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  t open on an int
31d0: 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20  Key.  ** table, 
31e0: 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63  then malloc spac
31f0: 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20  e for and store 
3200: 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  the pCur->nKey b
3210: 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a  ytes of key .  *
3220: 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69  * data..  */.  i
3230: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3240: 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50   && 0==pCur->apP
3250: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b  age[0]->intKey){
3260: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
3270: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
3280: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
3290: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
32a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
32b0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
32c0: 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75  Cur, 0, (int)pCu
32d0: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
32e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
3300: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
3310: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
3320: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
3330: 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
3340: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
3350: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
3360: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
3370: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
3380: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
3390: 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  >intKey || !pCur
33a0: 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28  ->pKey );..  if(
33b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33c0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
33d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
33e0: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
33f0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
3400: 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
3410: 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ]);.      pCur->
3420: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
3430: 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
3440: 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70  Page = -1;.    p
3450: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
3460: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
3470: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
3480: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3490: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
34a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
34b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
34c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
34d0: 65 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f  except pExcept o
34e0: 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  pen on the table
34f0: 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70   .** with root-p
3500: 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c  age iRoot. Usual
3510: 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ly, this is call
3520: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
3530: 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74  ursor.** pExcept
3540: 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69   is used to modi
3550: 66 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74  fy the table (Bt
3560: 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
3570: 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a  treeInsert())..*
3580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
3590: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
35a0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
35b0: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
35c0: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
35d0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
35e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3600: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
3610: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
3620: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
3630: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
3640: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
3650: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
3660: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
3670: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
3680: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
3690: 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  && .        p->e
36a0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
36b0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  LID ){.      int
36c0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
36d0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
36e0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
36f0: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
3700: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
3710: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
3720: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
3740: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
3750: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
3760: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
3770: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
3780: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
3790: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
37a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
37b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
37c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
37d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
37e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
37f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
3800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
3810: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
3820: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
3830: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
3840: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
3850: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
3860: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
3870: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
3880: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
3890: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
38a0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
38b0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
38c0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
38d0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
38e0: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
38f0: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
3900: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
3910: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
3920: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
3930: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
3940: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
3950: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
3960: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
3970: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
3980: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
3990: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
39a0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
39b0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
39c0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
39d0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
39e0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
39f0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
3a00: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b  turn pCur->skip;
3a10: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74  .  }.  pCur->eSt
3a20: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
3a30: 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ALID;.  rc = sql
3a40: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28  ite3BtreeMoveto(
3a50: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
3a60: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
3a70: 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20   &pCur->skip);. 
3a80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3a90: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
3aa0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
3ab0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
3ac0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
3ad0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
3ae0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
3af0: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
3b00: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
3b10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3b20: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
3b30: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
3b40: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
3b50: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
3b60: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
3b70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
3b80: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
3b90: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
3ba0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3bb0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
3bc0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
3bd0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
3be0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
3bf0: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
3c00: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
3c10: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
3c20: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
3c30: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
3c40: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
3c50: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
3c60: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
3c70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
3c80: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
3c90: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
3ca0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
3cb0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
3cc0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
3cd0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
3ce0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
3cf0: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
3d00: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
3d10: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
3d20: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
3d30: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
3d40: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
3d50: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
3d60: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
3d70: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
3d80: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
3d90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
3da0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
3db0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
3dc0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d   || pCur->skip!=
3dd0: 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  0 ){.    *pHasMo
3de0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
3df0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
3e00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
3e10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3e20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3e30: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
3e40: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
3e50: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
3e60: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
3e70: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
3e80: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
3e90: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
3ea0: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
3eb0: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
3ec0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
3ed0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
3ee0: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
3ef0: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
3f00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
3f10: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
3f20: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
3f30: 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65  Pgno iPtrMap, re
3f40: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
3f50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3f60: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3f70: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
3f80: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
3f90: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
3fa0: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
3fb0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
3fc0: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
3fd0: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
3fe0: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
3ff0: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
4000: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
4010: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
4020: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
4030: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
4040: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
4050: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
4060: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
4070: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
4080: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
4090: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
40a0: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
40b0: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
40c0: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
40d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
40e0: 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  o'..** An error 
40f0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
4100: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
4110: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
4120: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
4130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4140: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
4150: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
4160: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
4170: 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65  arent){.  DbPage
4180: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
4190: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
41a0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
41b0: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
41c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
41d0: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
41e0: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
41f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
4200: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
4210: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
4220: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
4230: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
4240: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4250: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4260: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4270: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
4280: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
4290: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
42a0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
42b0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
42c0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
42d0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
42e0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
42f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
4300: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
4310: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
4320: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
4330: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4340: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
4350: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
4360: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
4370: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
4380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
4390: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
43a0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
43b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
43c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
43d0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66  urn rc;.  }.  of
43e0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
43f0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
4400: 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70   key);.  pPtrmap
4410: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
4420: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
4430: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
4440: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
4450: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
4460: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
4470: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
4480: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
4490: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
44a0: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
44b0: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
44c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
44d0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
44e0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
44f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4500: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
4510: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
4520: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
4530: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
4540: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
4550: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61    }..  sqlite3Pa
4560: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
4570: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
4580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
4590: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
45a0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
45b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
45c0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
45d0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
45e0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
45f0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
4600: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
4610: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
4620: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
4630: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
4640: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
4650: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
4660: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4670: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
4680: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
4690: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
46a0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
46b0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
46c0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
46d0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
46e0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
46f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
4700: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
4710: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
4720: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
4730: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
4740: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
4750: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
4760: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
4770: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
4780: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
4790: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
47a0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
47b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
47c0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
47d0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
47e0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
47f0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
4800: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
4810: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
4820: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
4830: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
4840: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
4850: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
4860: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
4870: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
4880: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
4890: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
48a0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
48b0: 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ey);.  assert( p
48c0: 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70  EType!=0 );.  *p
48d0: 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b  EType = pPtrmap[
48e0: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70  offset];.  if( p
48f0: 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20  Pgno ) *pPgno = 
4900: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
4910: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20  p[offset+1]);.. 
4920: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
4930: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ef(pDbPage);.  i
4940: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
4950: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
4960: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
4970: 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e  T_BKPT;.  return
4980: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
4990: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
49a0: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
49b0: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
49c0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
49d0: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
49e0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
49f0: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
4a10: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
4a20: 66 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  fl(y,z) SQLITE_O
4a30: 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
4a40: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
4a50: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
4a60: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
4a70: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
4a80: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
4a90: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
4aa0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
4ab0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
4ac0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
4ad0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
4ae0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
4af0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
4b00: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
4b10: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
4b20: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
4b30: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
4b40: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
4b50: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
4b60: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
4b70: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
4b80: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
4b90: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
4ba0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
4bb0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
4bc0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
4bd0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
4be0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
4bf0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
4c00: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
4c10: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
4c20: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
4c30: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
4c40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
4c50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c60: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
4c70: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
4c80: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
4c90: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
4ca0: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
4cb0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76  ;.    struct _Ov
4cc0: 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20  flCell *pOvfl;. 
4cd0: 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67     pOvfl = &pPag
4ce0: 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  e->aOvfl[i];.   
4cf0: 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b   k = pOvfl->idx;
4d00: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
4d10: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
4d20: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
4d30: 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d     return pOvfl-
4d40: 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pCell;.      }.
4d50: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
4d60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4d70: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
4d80: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
4d90: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
4da0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
4db0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
4dc0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
4dd0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
4de0: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
4df0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
4e00: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
4e10: 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20  eCell() takes a 
4e20: 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61  .** cell index a
4e30: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
4e40: 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65  ument and sqlite
4e50: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
4e60: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
4e70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4e80: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
4e90: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
4ea0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  rgument..**.** W
4eb0: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c  ithin this file,
4ec0: 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29   the parseCell()
4ed0: 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61   macro can be ca
4ee0: 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  lled instead of.
4ef0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
4f00: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
4f10: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
4f20: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
4f30: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  e faster..*/.voi
4f40: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4f50: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
4f60: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
4f70: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
4f80: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
4f90: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
4fa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4fb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
4fc0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
4fd0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
4fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
4ff0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
5000: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
5010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5020: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
5030: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
5040: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
5050: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
5060: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5070: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
5080: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
5090: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
50a0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
50b0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
50c0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
50d0: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
50e0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
50f0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
5100: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
5110: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
5120: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
5130: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
5140: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
5150: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
5160: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
5170: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67   ){.      n += g
5180: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
5190: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
51a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
51b0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a    nPayload = 0;.
51c0: 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67      }.    n += g
51d0: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
51e0: 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  n], (u64*)&pInfo
51f0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e  ->nKey);.    pIn
5200: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
5210: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
5220: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
5230: 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  = 0;.    n += ge
5240: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
5250: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
5260: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
5270: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a  = nPayload;.  }.
5280: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
5290: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
52a0: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
52b0: 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79   n;.  if( likely
52c0: 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65  (nPayload<=pPage
52d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20  ->maxLocal) ){. 
52e0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
52f0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
5300: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
5310: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
5320: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
5330: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
5340: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
5350: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
5360: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
5370: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
5380: 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  ize of cell cont
5390: 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ent in bytes */.
53a0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
53b0: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49  load + n;.    pI
53c0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
53d0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
53e0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
53f0: 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28  w = 0;.    if( (
5400: 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29  nSize & ~3)==0 )
5410: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
5420: 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e  4;        /* Min
5430: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
5440: 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  s 4 */.    }.   
5450: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
5460: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65  (u16)nSize;.  }e
5470: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
5480: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
5490: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
54a0: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
54b0: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
54c0: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
54d0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
54e0: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
54f0: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
5500: 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66  nto.    ** overf
5510: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
5520: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
5530: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
5540: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20  nt of unused.   
5550: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
5560: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
5570: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
5580: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
5590: 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20  orage.    ** in 
55a0: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
55b0: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
55c0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72     **.    ** War
55d0: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
55e0: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
55f0: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
5600: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
5610: 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72     ** way will r
5620: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
5630: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
5640: 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rmat..    */.   
5650: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
5660: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
5670: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
5680: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
5690: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
56a0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
56b0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
56c0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20  d locally */.   
56d0: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
56e0: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
56f0: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
5700: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
5710: 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c  */..    minLocal
5720: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
5730: 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c  al;.    maxLocal
5740: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
5750: 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20  al;.    surplus 
5760: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50  = minLocal + (nP
5770: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
5780: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
5790: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
57a0: 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73  .    if( surplus
57b0: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
57c0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
57d0: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
57e0: 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  us;.    }else{. 
57f0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
5800: 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63  al = (u16)minLoc
5810: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
5820: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
5830: 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c   (u16)(pInfo->nL
5840: 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70  ocal + n);.    p
5850: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
5860: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
5870: 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e   4;.  }.}.#defin
5880: 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67  e parseCell(pPag
5890: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
58a0: 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   \.  sqlite3Btre
58b0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
58c0: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
58d0: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
58e0: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64  ), (pInfo)).void
58f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
5900: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
5910: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
5920: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
5930: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
5940: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
5950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5960: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
5970: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
5980: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
5990: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
59a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
59b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
59c0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
59d0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
59e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
59f0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
5a00: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
5a10: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
5a20: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
5a30: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
5a40: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
5a50: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
5a60: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
5a70: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
5a80: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
5a90: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
5aa0: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
5ab0: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
5ac0: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
5ad0: 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nter..*/.#ifndef
5ae0: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 75   NDEBUG.static u
5af0: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
5b00: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
5b10: 69 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  iCell){.  CellIn
5b20: 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  fo info;.  sqlit
5b30: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
5b40: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26  (pPage, iCell, &
5b50: 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  info);.  return 
5b60: 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65  info.nSize;.}.#e
5b70: 6e 64 69 66 0a 73 74 61 74 69 63 20 75 31 36 20  ndif.static u16 
5b80: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
5b90: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
5ba0: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
5bb0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  fo info;.  sqlit
5bc0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
5bd0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
5be0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75  , &info);.  retu
5bf0: 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d  rn info.nSize;.}
5c00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5c10: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
5c20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
5c30: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
5c40: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
5c50: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
5c60: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
5c70: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
5c80: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
5c90: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
5ca0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
5cb0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
5cc0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
5cd0: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
5ce0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
5cf0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
5d00: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  o;.  assert( pCe
5d10: 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ll!=0 );.  sqlit
5d20: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
5d30: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
5d40: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
5d50: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
5d60: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
5d70: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
5d80: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
5d90: 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
5da0: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
5db0: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
5dc0: 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
5dd0: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
5de0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
5df0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
5e00: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
5e10: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
5e20: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
5e30: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
5e40: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
5e50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5e60: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
5e70: 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65  l with index iCe
5e80: 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
5e90: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
5ea0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
5eb0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
5ec0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
5ed0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
5ee0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
5ef0: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
5f00: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
5f10: 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a  utOvfl(MemPage *
5f20: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
5f30: 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  ){.  u8 *pCell;.
5f40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5f50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
5f60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
5f70: 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  );.  pCell = fin
5f80: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
5f90: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72  age, iCell);.  r
5fa0: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f  eturn ptrmapPutO
5fb0: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
5fc0: 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ell);.}.#endif..
5fd0: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
5fe0: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
5ff0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
6000: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
6010: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
6020: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
6030: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
6040: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
6050: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
6060: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
6070: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
6080: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
6090: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
60a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
60b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
60c0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
60d0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
60e0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
60f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6100: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
6110: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
6120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6130: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
6140: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64  cell */.  int ad
6150: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
6160: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6170: 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  f first byte aft
6180: 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  er cell pointer 
6190: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68  array */.  int h
61a0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
61b0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
61c0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
61d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
61e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
61f0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
6200: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
6210: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
6220: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6230: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
6240: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
6250: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
6260: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
6270: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
6280: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
6290: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
62b0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
62c0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
62d0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
6300: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
6310: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6320: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
6330: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
6340: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
6350: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
6360: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
6370: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
6380: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6390: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
63a0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
63b0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
63c0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
63d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
63e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
63f0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
6400: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
6410: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
6420: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
6430: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6440: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
6450: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
6460: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
6470: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
6480: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
6490: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
64a0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
64b0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
64c0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
64d0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
64e0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
64f0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
6500: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
6510: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
6520: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
6530: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
6540: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
6550: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
6560: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
6570: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
6580: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
6590: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
65a0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
65b0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
65c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
65d0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
65e0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
65f0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
6600: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
6610: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
6620: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
6630: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
6640: 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20  pAddr);.    if( 
6650: 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  pc>=usableSize )
6660: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6670: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6680: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69  PT;.    }.    si
6690: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
66a0: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
66b0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
66c0: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62  size;.    if( cb
66d0: 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  rk<cellOffset+2*
66e0: 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a 65  nCell || pc+size
66f0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
6700: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6710: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6720: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
6730: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
6740: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
6750: 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  >=0 );.    memcp
6760: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
6770: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
6780: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
6790: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
67a0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
67b0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
67c0: 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ll );.  put2byte
67d0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
67e0: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
67f0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
6800: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
6810: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
6820: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
6830: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
6840: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
6850: 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b  , 0, cbrk-addr);
6860: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6870: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
6880: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
6890: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
68a0: 2d 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46  -addr!=pPage->nF
68b0: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
68c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
68d0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
68e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
68f0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6900: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
6910: 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e  space on a page.
6920: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
6930: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
6940: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74  ge->aData[] of t
6950: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
6960: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f  .** the new allo
6970: 63 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c  cation.  The cal
6980: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
6990: 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
69a0: 75 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20 54  ugh.** space.  T
69b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
69c0: 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a   never fail..**.
69d0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  ** If the page c
69e0: 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f  ontains nBytes o
69f0: 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74  f free space but
6a00: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
6a10: 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63  n.** nBytes of c
6a20: 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73  ontiguous free s
6a30: 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  pace, then this 
6a40: 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69  routine automati
6a50: 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64  cally.** calls d
6a60: 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29  efragementPage()
6a70: 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20   to consolidate 
6a80: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62  all free space b
6a90: 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  efore .** alloca
6aa0: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75  ting the new chu
6ab0: 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nk..*/.static in
6ac0: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
6ad0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6ae0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
6af0: 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b  t addr, pc, hdr;
6b00: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
6b10: 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20  nt nFrag;.  int 
6b20: 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  top;.  int nCell
6b30: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
6b40: 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  et;.  unsigned c
6b50: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20  har *data;.  .  
6b60: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
6b70: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ata;.  assert( s
6b80: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
6b90: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
6ba0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
6bb0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
6bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6bd0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6be0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6bf0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
6c00: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
6c10: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
6c20: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
6c30: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
6c40: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
6c50: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
6c60: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50 61  flow==0 );.  pPa
6c70: 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
6c80: 36 29 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d  6)nByte;.  hdr =
6c90: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
6ca0: 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61  t;..  nFrag = da
6cb0: 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28  ta[hdr+7];.  if(
6cc0: 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20   nFrag<60 ){.   
6cd0: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66   /* Search the f
6ce0: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
6cf0: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
6d00: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
6d10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63   the.    ** spac
6d20: 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20  e request. */.  
6d30: 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a    addr = hdr+1;.
6d40: 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d      while( (pc =
6d50: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6d60: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
6d70: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
6d80: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
6d90: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
6da0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
6db0: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
6dc0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
6dd0: 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34  if( size<nByte+4
6de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
6df0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
6e00: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
6e10: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
6e20: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
6e30: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
6e40: 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a 20      return pc;. 
6e50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6e60: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
6e70: 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  (&data[pc+2], x)
6e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
6e90: 72 6e 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20  rn pc + x;.     
6ea0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6eb0: 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20     addr = pc;.  
6ec0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
6ed0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
6ee0: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
6ef0: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
6f00: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
6f10: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
6f20: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a  ontent area..  *
6f30: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
6f40: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
6f50: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ;.  nCell = get2
6f60: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
6f70: 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  ]);.  cellOffset
6f80: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
6f90: 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61  fset;.  if( nFra
6fa0: 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66  g>=60 || cellOff
6fb0: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20  set + 2*nCell > 
6fc0: 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20  top - nByte ){. 
6fd0: 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
6fe0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 74 6f  e(pPage);.    to
6ff0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
7000: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a  ta[hdr+5]);.  }.
7010: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
7020: 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66    assert( cellOf
7030: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c  fset + 2*nCell <
7040: 3d 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62  = top );.  put2b
7050: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
7060: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
7070: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
7080: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
7090: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
70a0: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
70b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
70c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
70d0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
70e0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
70f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
7100: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
7110: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
7120: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
7130: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
7140: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
7150: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
7160: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
7170: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
7180: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
7190: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
71a0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
71b0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
71c0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
71d0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
71e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
71f0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
7200: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
7210: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73  egin, hdr;.  uns
7220: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7230: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
7240: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
7250: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
7260: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7270: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
7280: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7290: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
72a0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
72b0: 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65  set+6+(pPage->le
72c0: 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73  af?0:4) );.  ass
72d0: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
72e0: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
72f0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
7300: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7310: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
7320: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
7330: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
7340: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
7350: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
7360: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
7370: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
7380: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
7390: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
73a0: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
73b0: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
73c0: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
73d0: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
73e0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
73f0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
7400: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
7410: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
7420: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
7430: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
7440: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
7450: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20  blocks */.  hdr 
7460: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
7470: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
7480: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
7490: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
74a0: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
74b0: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
74c0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
74d0: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
74e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
74f0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  4 );.    if( pbe
7500: 67 69 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20  gin<=addr ) {.  
7510: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7520: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7530: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
7540: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69   pbegin;.  }.  i
7550: 66 20 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65  f ( pbegin>pPage
7560: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7570: 65 2d 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75  e-4 ) {.    retu
7580: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7590: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
75a0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
75b0: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
75c0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
75d0: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
75e0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
75f0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
7600: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
7610: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
7620: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
7630: 46 72 65 65 20 2b 3d 20 28 75 31 36 29 73 69 7a  Free += (u16)siz
7640: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
7650: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
7660: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
7670: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
7680: 73 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  set + 1;.  while
7690: 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32  ( (pbegin = get2
76a0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
76b0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ))>0 ){.    int 
76c0: 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b  pnext, psize, x;
76d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
76e0: 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20  gin>addr );.    
76f0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
7700: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7710: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
7720: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
7730: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
7740: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
7750: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
7760: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
7770: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
7780: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
7790: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
77a0: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
77b0: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
77c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72  );.      if( (fr
77d0: 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28  ag<0) || (frag>(
77e0: 69 6e 74 29 64 61 74 61 5b 70 50 61 67 65 2d 3e  int)data[pPage->
77f0: 68 64 72 4f 66 66 73 65 74 2b 37 5d 29 20 29 7b  hdrOffset+7]) ){
7800: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7810: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7820: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
7830: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
7840: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 28  drOffset+7] -= (
7850: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
7860: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7870: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
7880: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
7890: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
78a0: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
78b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
78c0: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
78d0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
78e0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
78f0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
7900: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
7910: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
7920: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
7930: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
7940: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
7950: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
7960: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
7970: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
7980: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
7990: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
79a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
79b0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
79c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
79d0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
79e0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
79f0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
7a00: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
7a10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
7a20: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
7a30: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
7a40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
7a50: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
7a60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
7a70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
7a80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
7a90: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
7aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7ab0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
7ac0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
7ad0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
7ae0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
7af0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
7b00: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
7b10: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
7b20: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
7b30: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
7b40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
7b50: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
7b60: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
7b70: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
7b80: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
7b90: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
7ba0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
7bb0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
7bc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
7bd0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
7be0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
7bf0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
7c00: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
7c10: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
7c20: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
7c30: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
7c40: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
7c50: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
7c60: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
7c70: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
7c80: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
7c90: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
7ca0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
7cb0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
7cc0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
7cd0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
7ce0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7cf0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
7d00: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
7d10: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
7d20: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
7d30: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
7d40: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
7d50: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
7d60: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
7d70: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
7d80: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
7d90: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
7da0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
7db0: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
7dc0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
7dd0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
7de0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
7df0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
7e00: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
7e10: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
7e20: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
7e30: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
7e40: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
7e50: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
7e60: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
7e70: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
7e80: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
7e90: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
7ea0: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
7eb0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
7ec0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
7ed0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
7ee0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
7ef0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
7f00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7f10: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7f20: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
7f30: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
7f40: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
7f50: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
7f60: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
7f70: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
7f80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
7f90: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
7fa0: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
7fb0: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
7fc0: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
7fd0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
7fe0: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
7ff0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
8000: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
8010: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
8020: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
8030: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
8040: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
8050: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
8060: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
8070: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
8080: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
8090: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
80a0: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d  3BtreeInitPage(M
80b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
80c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
80d0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
80e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
80f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8100: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8110: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8120: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
8130: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
8140: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8150: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
8160: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
8170: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
8180: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8190: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
81a0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
81b0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
81c0: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
81d0: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
81e0: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8200: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
8210: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
8220: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
8230: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
8240: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8250: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
8260: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8270: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
8280: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
8290: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
82a0: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
82b0: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
82c0: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
82d0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
82e0: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
82f0: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
8300: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
8310: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
8320: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
8330: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
8340: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
8350: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
8360: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
8370: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
8380: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
8390: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
83a0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
83b0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
83c0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
83d0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
83e0: 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70  t area */..    p
83f0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
8400: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
8410: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
8420: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
8430: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
8440: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
8450: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
8460: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8470: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
8480: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
8490: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
84a0: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36  ->pageSize<=3276
84b0: 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  8 );.    pPage->
84c0: 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e  maskPage = pBt->
84d0: 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20  pageSize - 1;.  
84e0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
84f0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
8500: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
8510: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
8520: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
8530: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
8540: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
8550: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70  e->leaf;.    top
8560: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8570: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
8580: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
8590: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
85a0: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
85b0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
85c0: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
85d0: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
85e0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
85f0: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
8600: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
8610: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
8620: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8630: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
8640: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
8650: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
8660: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
8670: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
8680: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
8690: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
86a0: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d  a[hdr+7] + top -
86b0: 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32   (cellOffset + 2
86c0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pPage->nCell);.
86d0: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
86e0: 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78  ){.      u16 nex
86f0: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
8700: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
8710: 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -4 ){.        /*
8720: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
8730: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
8740: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
8750: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8760: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
8770: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
8780: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
8790: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
87a0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
87b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
87c0: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
87d0: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
87e0: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
87f0: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
8800: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
8810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8820: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8830: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
8840: 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a   nFree += size;.
8850: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
8860: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
8870: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 6e  ->nFree = (u16)n
8880: 46 72 65 65 3b 0a 20 20 20 20 69 66 28 20 6e 46  Free;.    if( nF
8890: 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  ree>=usableSize 
88a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
88b0: 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78   space cannot ex
88c0: 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20  ceed total page 
88d0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  size */.      re
88e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
88f0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
8900: 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65  ..#if 0.  /* Che
8910: 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20  ck that all the 
8920: 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65 20 63  offsets in the c
8930: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
8940: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
8950: 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f  e. .  ** .  ** O
8960: 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e  mitting this con
8970: 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61  sistency check a
8980: 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70 50 61  nd using the pPa
8990: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73  ge->maskPage mas
89a0: 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  k.  ** to preven
89b0: 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68  t overrunning th
89c0: 65 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e  e page buffer in
89d0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75   findCell() resu
89e0: 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e  lts in a.  ** 2.
89f0: 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67  5% performance g
8a00: 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20  ain..  */.  {.  
8a10: 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20    u8 *pOff;     
8a20: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
8a30: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c  sed to check all
8a40: 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72   cell offsets ar
8a50: 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20  e in range */.  
8a60: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
8a70: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8a80: 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66   end of cell off
8a90: 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  set array */.   
8aa0: 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20   u8 mask;       
8ab0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74    /* Mask of bit
8ac0: 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a  s that must be z
8ad0: 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65  ero in MSB of ce
8ae0: 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20  ll offsets */.  
8af0: 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29    mask = ~(((u8)
8b00: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
8b10: 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64  8))-1);.    pEnd
8b20: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
8b30: 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65  set + pPage->nCe
8b40: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70  ll*2];.    for(p
8b50: 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  Off=&data[cellOf
8b60: 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e  fset]; pOff!=pEn
8b70: 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d  d && !((*pOff)&m
8b80: 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a  ask); pOff+=2);.
8b90: 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45      if( pOff!=pE
8ba0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  nd ){.      retu
8bb0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8bc0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
8bd0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 70 50  }.#endif..    pP
8be0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
8bf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
8c00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8c10: 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70  * Set up a raw p
8c20: 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c  age so that it l
8c30: 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61  ooks like a data
8c40: 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e  base page holdin
8c50: 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e  g.** no entries.
8c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8c70: 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65  zeroPage(MemPage
8c80: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
8c90: 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  gs){.  unsigned 
8ca0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
8cb0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53  ge->aData;.  BtS
8cc0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
8cd0: 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64  ge->pBt;.  u8 hd
8ce0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
8cf0: 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73  fset;.  u16 firs
8d00: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
8d10: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
8d20: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
8d30: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  age)==pPage->pgn
8d40: 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
8d50: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
8d60: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
8d70: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
8d80: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
8d90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
8da0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
8db0: 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a  age) == data );.
8dc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8dd0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
8de0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
8df0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
8e00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8e10: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8e20: 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74  .  /*memset(&dat
8e30: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
8e40: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
8e50: 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d  );*/.  data[hdr]
8e60: 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a   = (char)flags;.
8e70: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
8e80: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
8e90: 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29  F_LEAF)==0 ?1:0)
8ea0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
8eb0: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
8ec0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
8ed0: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
8ee0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
8ef0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
8f00: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
8f10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
8f20: 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65   first;.  decode
8f30: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
8f40: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
8f50: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
8f60: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
8f70: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
8f80: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
8f90: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
8fa0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
8fb0: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
8fc0: 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50  e<=32768 );.  pP
8fd0: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
8fe0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
8ff0: 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  1;.  pPage->nCel
9000: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
9010: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
9020: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
9030: 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
9040: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
9050: 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
9060: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
9070: 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
9080: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
9090: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
90a0: 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
90b0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
90c0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
90d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
90e0: 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
90f0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
9100: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
9110: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
9120: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
9130: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
9140: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
9150: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
9160: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
9170: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
9180: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9190: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
91a0: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72  1 ? 100 : 0;.  r
91b0: 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
91c0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
91d0: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
91e0: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
91f0: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
9200: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
9210: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
9220: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eeded..**.** If 
9230: 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c  the noContent fl
9240: 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
9250: 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
9260: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a  ot care about.**
9270: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
9280: 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
9290: 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
92a0: 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
92b0: 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
92c0: 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
92d0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
92e0: 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
92f0: 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
9300: 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
9310: 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
9320: 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
9330: 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
9340: 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
9350: 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
9360: 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
9370: 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
9380: 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
9390: 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
93a0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
93b0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20  3BtreeGetPage(. 
93c0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
93d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
93e0: 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
93f0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
9400: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
9410: 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
9420: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
9430: 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
9440: 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
9450: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
9460: 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
9470: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c       /* Do not l
9480: 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
9490: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
94a0: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
94b0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
94c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
94d0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
94e0: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
94f0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
9500: 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
9510: 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
9520: 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e  )&pDbPage, noCon
9530: 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  tent);.  if( rc 
9540: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
9550: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
9560: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
9570: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
9580: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9590: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
95a0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
95b0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
95c0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
95d0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
95e0: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
95f0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
9600: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
9610: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
9620: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
9630: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
9640: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
9650: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
9660: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
9670: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
9680: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
9690: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
96a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
96b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
96c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
96d0: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
96e0: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
96f0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
9700: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
9710: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
9720: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
9730: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
9740: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
9750: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
9760: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
9770: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
9780: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
9790: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
97a0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
97b0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
97c0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
97d0: 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50  atic Pgno pagerP
97e0: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
97f0: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e  d *pBt){.  int n
9800: 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  Page = -1;.  int
9810: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
9820: 42 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20  Bt->pPage1 );.  
9830: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9840: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
9850: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
9860: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
9870: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
9880: 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72  e==-1 );.  retur
9890: 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d  n (Pgno)nPage;.}
98a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
98b0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
98c0: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
98d0: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
98e0: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
98f0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
9900: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
9910: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
9920: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
9930: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
9940: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
9950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9960: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
9970: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
9980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
99a0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
99b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
99c0: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
99d0: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
99e0: 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  ge **ppPage     
99f0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
9a00: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
9a10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
9a20: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
9a30: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9a40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9a50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9a60: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
9a70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9a80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
9a90: 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20    }..  /* It is 
9aa0: 6f 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74  often the case t
9ab0: 68 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20  hat the page we 
9ac0: 77 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20  want is already 
9ad0: 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49  in cache..  ** I
9ae0: 66 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72  f so, get it dir
9af0: 65 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76  ectly.  This sav
9b00: 65 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e  es us from havin
9b10: 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70  g to call.  ** p
9b20: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
9b30: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e  to make sure pgn
9b40: 6f 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69  o is within limi
9b50: 74 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74  ts, which result
9b60: 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73  s.  ** in a meas
9b70: 75 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61  ureable performa
9b80: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73  nce improvements
9b90: 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ..  */.  *ppPage
9ba0: 20 3d 20 70 50 61 67 65 20 3d 20 62 74 72 65 65   = pPage = btree
9bb0: 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
9bc0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
9bd0: 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67  ge ){.    /* Pag
9be0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
9bf0: 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 72 63 20  cache */.    rc 
9c00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
9c10: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67  else{.    /* Pag
9c20: 65 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  e not in cache. 
9c30: 20 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a   Acquire it. */.
9c40: 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67      if( pgno>pag
9c50: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
9c60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9c70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9c80: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
9c90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
9ca0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
9cb0: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
9cc0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9cd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
9ce0: 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  ge = *ppPage;.  
9cf0: 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
9d00: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  isInit ){.    rc
9d10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
9d20: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
9d30: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
9d40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
9d50: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
9d60: 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  );.    *ppPage =
9d70: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9d80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
9d90: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
9da0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
9db0: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
9dc0: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
9dd0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
9de0: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
9df0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
9e00: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
9e10: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
9e20: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
9e30: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
9e40: 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  low==0 || sqlite
9e50: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
9e60: 6e 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  nt(pPage->pDbPag
9e70: 65 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65  e)>1 );.    asse
9e80: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
9e90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9ea0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
9eb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9ec0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
9ed0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
9ee0: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
9ef0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
9f00: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
9f10: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
9f20: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
9f30: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9f40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9f50: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9f60: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
9f70: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
9f80: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
9f90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
9fa0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
9fb0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
9fc0: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
9fd0: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
9fe0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
9ff0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
a000: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
a010: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
a020: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
a030: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
a040: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
a050: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
a060: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
a070: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
a080: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
a090: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
a0a0: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
a0b0: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
a0c0: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
a0d0: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
a0e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
a0f0: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
a100: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
a110: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
a120: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
a130: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
a140: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69  xtra(pData);.  i
a150: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
a160: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a170: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a180: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
a190: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
a1a0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
a1b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
a1c0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
a1d0: 28 70 44 61 74 61 29 3e 30 20 29 7b 0a 20 20 20  (pData)>0 ){.   
a1e0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
a1f0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
a200: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
a210: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
a220: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
a230: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
a240: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
a250: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
a260: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
a270: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
a280: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
a290: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
a2a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a2b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a2c0: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
a2d0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
a2e0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
a2f0: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
a300: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
a310: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
a320: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
a330: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
a340: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
a350: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
a360: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
a370: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
a380: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
a390: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
a3a0: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
a3b0: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
a3c0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
a3d0: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
a3e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
a3f0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
a400: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
a410: 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
a420: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
a430: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
a440: 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
a450: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
a460: 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
a470: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
a480: 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
a490: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
a4a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
a4b0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
a4c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
a4d0: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
a4e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
a4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
a500: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
a510: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
a520: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
a530: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a540: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
a550: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
a560: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
a570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a580: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
a590: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
a5a0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
a5b0: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
a5c0: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
a5d0: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71  pen() */.){.  sq
a5e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
a5f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
a600: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
a610: 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68   btree */.  BtSh
a620: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
a630: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
a640: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
a650: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
a660: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
a670: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
a680: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
a690: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a6a0: 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 0a 20    u8 nReserve;. 
a6b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
a6c0: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a  DbHeader[100];..
a6d0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
a6e0: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
a6f0: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
a700: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
a710: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
a720: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
a730: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
a740: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
a750: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
a760: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
a770: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
a780: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
a790: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
a7a0: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
a7b0: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
a7c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a7d0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a7e0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
a7f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
a800: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
a810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
a820: 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  YDB.    const in
a830: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20  t isMemdb = 0;. 
a840: 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74   #else.    const
a850: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a   int isMemdb = z
a860: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72  Filename && !str
a870: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
a880: 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65  :memory:");.  #e
a890: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ndif.#endif..  a
a8a0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
a8b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a8c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
a8d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56  >mutex) );..  pV
a8e0: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
a8f0: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
a900: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
a910: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
a920: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a930: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
a940: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
a950: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
a960: 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64  db = db;..#if !d
a970: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a980: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
a990: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
a9a0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
a9b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
a9c0: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
a9d0: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
a9e0: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
a9f0: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
aa00: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
aa10: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
aa20: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
aa30: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  */.  if( isMemdb
aa40: 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66  ==0.   && (db->f
aa50: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74  lags & SQLITE_Vt
aa60: 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69  ab)==0.   && zFi
aa70: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
aa80: 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20  ame[0].  ){.    
aa90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
aaa0: 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
aab0: 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
aac0: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
aad0: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
aae0: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
aaf0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
ab00: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
ab10: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
ab20: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
ab30: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
ab40: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
ab50: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
ab60: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
ab70: 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43  = SQLITE_SharedC
ab80: 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20  ache;.      if( 
ab90: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
aba0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
abb0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
abc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
abd0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
abe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
abf0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
ac00: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75  , zFilename, nFu
ac10: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
ac20: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ac30: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
ac40: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
ac50: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
ac60: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
ac70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ac80: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
ac90: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
aca0: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
acb0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
acc0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
acd0: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
ace0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
acf0: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
ad00: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ad10: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
ad20: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
ad30: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
ad40: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
ad60: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
ad70: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
ad80: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
ad90: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
ada0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
adb0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
adc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
add0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
ade0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
adf0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
ae00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ae10: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
ae20: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
ae30: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
ae40: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
ae50: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
ae60: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
ae70: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
ae80: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
ae90: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
aea0: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
aeb0: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
aec0: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
aed0: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
aee0: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
aef0: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
af00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
af10: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
af20: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
af30: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
af40: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
af50: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
af60: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
af70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
af80: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
af90: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
afa0: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
afb0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
afc0: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
afd0: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
afe0: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
aff0: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
b000: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
b010: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
b020: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
b030: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
b040: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
b050: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
b060: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
b070: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
b080: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
b090: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
b0a0: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
b0b0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
b0c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
b0d0: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
b0e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
b0f0: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
b100: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
b110: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
b120: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
b130: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
b140: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
b150: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
b160: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b170: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
b180: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
b190: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
b1a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
b1b0: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
b1c0: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
b1d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
b1f0: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
b200: 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  fsFlags);.    if
b210: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b220: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b230: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
b240: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
b250: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
b260: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
b270: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
b280: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b290: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
b2a0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
b2b0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
b2c0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
b2d0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
b2e0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
b2f0: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
b300: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
b310: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
b320: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
b330: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
b340: 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d  einit);.    pBt-
b350: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
b360: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
b370: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
b380: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
b390: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
b3a0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
b3b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
b3c0: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
b3d0: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
b3e0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
b3f0: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
b400: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
b410: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
b420: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
b430: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
b440: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
b450: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
b460: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  e = 0;.      sql
b470: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
b480: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
b490: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
b4a0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
b4b0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
b4c0: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
b4d0: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
b4e0: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
b4f0: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
b500: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
b510: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
b520: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
b530: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
b540: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
b550: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
b560: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
b570: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
b580: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
b590: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
b5a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
b5b0: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
b5c0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
b5d0: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
b5e0: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
b5f0: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
b600: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
b610: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
b620: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
b630: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b640: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
b650: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
b660: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
b670: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
b680: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
b690: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
b6a0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
b6b0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
b6c0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
b6d0: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
b6e0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
b6f0: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
b700: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b710: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
b720: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
b730: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
b740: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
b750: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
b760: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
b770: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
b780: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
b790: 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
b7a0: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
b7b0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
b7c0: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
b7d0: 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
b7e0: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
b7f0: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62   }.    pBt->usab
b800: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
b810: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
b820: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
b830: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
b840: 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
b850: 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
b860: 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
b870: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
b880: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
b890: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
b8a0: 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21  Size);.   .#if !
b8b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b8c0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
b8d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
b8e0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
b8f0: 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
b900: 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
b910: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
b920: 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
b930: 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
b940: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
b950: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
b960: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
b970: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
b980: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
b990: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
b9a0: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
b9b0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
b9c0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
b9d0: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
b9e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
b9f0: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
ba00: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
ba10: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
ba20: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
ba30: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ba40: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
ba50: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
ba60: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
ba70: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
ba80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ba90: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
baa0: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
bab0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
bac0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
bad0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
bae0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
baf0: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
bb00: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
bb10: 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
bb20: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
bb30: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
bb40: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
bb50: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
bb60: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
bb70: 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
bb80: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
bb90: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
bba0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
bbb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
bbc0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
bbd0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
bbe0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
bbf0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
bc00: 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
bc10: 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
bc20: 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
bc30: 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
bc40: 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
bc50: 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
bc60: 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
bc70: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
bc80: 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
bc90: 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
bca0: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
bcb0: 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
bcc0: 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
bcd0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
bce0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
bcf0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
bd00: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
bd10: 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
bd20: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
bd30: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
bd40: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
bd50: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
bd60: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
bd70: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
bd80: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
bd90: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
bda0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
bdb0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
bdc0: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
bdd0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
bde0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
bdf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
be00: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
be10: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
be20: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
be30: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
be40: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
be50: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
be60: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
be70: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
be80: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
be90: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
bea0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
beb0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
bec0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
bed0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
bee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
bef0: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
bf00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bf10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bf20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
bf30: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
bf40: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
bf50: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
bf60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
bf70: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
bf80: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
bf90: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
bfa0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
bfb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
bfc0: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
bfd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
bfe0: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
bff0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c000: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
c010: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
c020: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
c030: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
c040: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
c050: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
c060: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
c070: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
c080: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
c090: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
c0a0: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
c0b0: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
c0c0: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
c0d0: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
c0e0: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
c0f0: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
c100: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
c110: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
c120: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c130: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
c140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
c150: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
c160: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
c170: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
c180: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c190: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
c1a0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
c1b0: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
c1c0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
c1d0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
c1e0: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
c1f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
c200: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
c210: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
c220: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
c230: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
c240: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
c250: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
c260: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
c270: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
c280: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
c290: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
c2a0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
c2b0: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
c2c0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
c2d0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
c2e0: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
c2f0: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
c300: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
c310: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
c320: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
c330: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
c340: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
c350: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
c360: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
c370: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
c380: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
c390: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
c3a0: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
c3b0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
c3c0: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
c3d0: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
c3e0: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
c3f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
c400: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
c410: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
c420: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
c430: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
c440: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
c450: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
c460: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
c470: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
c480: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
c490: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
c4a0: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
c4b0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
c4c0: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
c4d0: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
c4e0: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
c4f0: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
c500: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
c510: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
c520: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
c530: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
c540: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
c550: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
c560: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
c570: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
c580: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
c590: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
c5a0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
c5b0: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
c5c0: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
c5d0: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
c5e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c5f0: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
c600: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
c610: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
c620: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
c630: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
c640: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
c650: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
c660: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c670: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c680: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
c690: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
c6a0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
c6b0: 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
c6c0: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
c6d0: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
c6e0: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
c6f0: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
c700: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
c710: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
c720: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
c730: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
c740: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
c750: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
c760: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
c770: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
c780: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
c790: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
c7a0: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
c7b0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
c7c0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
c7d0: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
c7e0: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
c7f0: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
c800: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
c810: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
c820: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c830: 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
c840: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
c850: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
c860: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
c870: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
c880: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
c890: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
c8a0: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
c8b0: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
c8c0: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
c8d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
c8e0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c8f0: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
c900: 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
c910: 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
c920: 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
c930: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
c940: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
c950: 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
c960: 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
c970: 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
c980: 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
c990: 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
c9a0: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
c9b0: 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
c9c0: 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
c9d0: 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
c9e0: 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
c9f0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
ca00: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
ca10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
ca20: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
ca30: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
ca40: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
ca50: 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
ca60: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
ca70: 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
ca80: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
ca90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
caa0: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
cab0: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
cac0: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
cad0: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
cae0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
caf0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
cb00: 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
cb10: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
cb20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
cb30: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
cb40: 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
cb50: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
cb60: 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
cb70: 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
cb80: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
cb90: 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
cba0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
cbb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cbc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
cbd0: 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
cbe0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
cbf0: 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
cc00: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
cc10: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
cc20: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
cc30: 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
cc40: 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
cc50: 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
cc60: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
cc70: 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
cc80: 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
cc90: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
cca0: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
ccb0: 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
ccc0: 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
ccd0: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
cce0: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
ccf0: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
cd00: 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
cd10: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
cd20: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
cd30: 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
cd40: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
cd50: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
cd60: 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
cd70: 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
cd80: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
cd90: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
cda0: 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
cdb0: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
cdc0: 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
cdd0: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
cde0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
cdf0: 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
ce00: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
ce10: 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
ce20: 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
ce30: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
ce40: 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
ce50: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
ce60: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
ce70: 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
ce80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
ce90: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
cea0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
ceb0: 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
cec0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
ced0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cee0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
cef0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
cf00: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
cf10: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
cf20: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
cf30: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
cf40: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
cf50: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
cf60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cf70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
cf80: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
cf90: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
cfa0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
cfb0: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
cfc0: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
cfd0: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
cfe0: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
cff0: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
d000: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
d010: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
d020: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
d030: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
d040: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
d050: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
d060: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
d070: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
d080: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
d090: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
d0a0: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
d0b0: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
d0c0: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
d0d0: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
d0e0: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
d0f0: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
d100: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
d110: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
d120: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
d130: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
d140: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
d150: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
d160: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
d170: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
d180: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
d190: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
d1a0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
d1b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d1c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d1d0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
d1e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
d1f0: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
d200: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
d210: 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
d220: 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
d230: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
d240: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
d250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d260: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
d270: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
d280: 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
d290: 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
d2a0: 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
d2b0: 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
d2c0: 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
d2d0: 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
d2e0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
d2f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
d300: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
d310: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
d320: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
d330: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
d340: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d350: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
d360: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
d370: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
d380: 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
d390: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
d3a0: 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
d3b0: 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
d3c0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
d3d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
d3e0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
d3f0: 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
d400: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d410: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
d420: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
d430: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
d440: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
d450: 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
d460: 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
d470: 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
d480: 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
d490: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
d4a0: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
d4b0: 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
d4c0: 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
d4d0: 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
d4e0: 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
d4f0: 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
d500: 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
d510: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
d520: 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
d530: 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
d540: 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
d550: 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
d560: 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
d570: 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
d580: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d590: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
d5a0: 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
d5b0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
d5c0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
d5d0: 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
d5e0: 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
d5f0: 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
d600: 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
d610: 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
d620: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
d630: 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
d640: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
d650: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
d660: 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
d670: 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
d680: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
d690: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
d6a0: 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
d6b0: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
d6c0: 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
d6d0: 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
d6e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
d6f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
d700: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
d710: 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
d720: 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
d730: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
d740: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
d750: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
d760: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
d770: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
d780: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d790: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
d7a0: 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
d7b0: 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
d7c0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
d7d0: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
d7e0: 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
d7f0: 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
d800: 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
d810: 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
d820: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
d830: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
d840: 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
d850: 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
d860: 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
d870: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
d880: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
d890: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
d8a0: 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70  Bt->pPage1 && !p
d8b0: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
d8c0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
d8d0: 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
d8e0: 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
d8f0: 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  ace(pBt);.    rc
d900: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
d910: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
d920: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
d930: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  geSize);.  }.  p
d940: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
d950: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
d960: 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (u16)nReserve;.
d970: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
d980: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
d990: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
d9a0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
d9b0: 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
d9c0: 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
d9d0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
d9e0: 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
d9f0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
da00: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
da10: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
da20: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
da30: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
da40: 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
da50: 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
da60: 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
da70: 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
da80: 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
da90: 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
daa0: 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
dab0: 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
dac0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
dad0: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
dae0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
daf0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
db00: 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
db10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
db20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
db30: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
db40: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
db50: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
db60: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
db70: 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
db80: 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
db90: 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
dba0: 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
dbb0: 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
dbc0: 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
dbd0: 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
dbe0: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
dbf0: 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
dc00: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
dc10: 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
dc20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
dc30: 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
dc40: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
dc50: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
dc60: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
dc70: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
dc80: 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
dc90: 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
dca0: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
dcb0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
dcc0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23  .  return n;.}.#
dcd0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
dce0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
dcf0: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
dd00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dd10: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
dd20: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
dd30: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
dd40: 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
dd50: 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
dd60: 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
dd70: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
dd80: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
dd90: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
dda0: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
ddb0: 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
ddc0: 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
ddd0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
dde0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
ddf0: 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
de00: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
de10: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
de20: 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
de30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
de40: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
de50: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
de60: 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
de70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
de80: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
de90: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
dea0: 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
deb0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
dec0: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
ded0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
dee0: 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
def0: 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
df00: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
df10: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ( pBt->pageSizeF
df20: 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30  ixed && (av ?1:0
df30: 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
df40: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
df50: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
df60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
df70: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
df80: 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
df90: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
dfa0: 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
dfb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
dfc0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
dfd0: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
dfe0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
dff0: 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
e000: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
e010: 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
e020: 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
e030: 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
e040: 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
e050: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e060: 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
e070: 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
e080: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e090: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
e0a0: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
e0b0: 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
e0c0: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
e0d0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
e0e0: 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
e0f0: 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
e100: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
e110: 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
e120: 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
e130: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
e140: 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
e150: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
e160: 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
e170: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
e180: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
e190: 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
e1a0: 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
e1b0: 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
e1c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
e1d0: 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
e1e0: 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
e1f0: 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
e200: 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
e210: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
e220: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
e230: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
e240: 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
e250: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
e260: 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
e270: 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
e280: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
e290: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
e2a0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
e2b0: 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
e2c0: 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
e2d0: 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
e2e0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
e2f0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
e300: 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
e310: 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Bt){.  int rc;. 
e320: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
e330: 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a  ;.  int nPage;..
e340: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e350: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
e360: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
e370: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20  ( pBt->pPage1 ) 
e380: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e390: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e3a0: 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
e3b0: 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
e3c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e3d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
e3e0: 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
e3f0: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
e400: 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
e410: 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
e420: 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
e430: 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
e440: 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  . .  */.  rc = s
e450: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
e460: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
e470: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  , &nPage);.  if(
e480: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e490: 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31  {.    goto page1
e4a0: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
e4b0: 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e  }else if( nPage>
e4c0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67  0 ){.    int pag
e4d0: 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75  eSize;.    int u
e4e0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
e4f0: 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
e500: 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
e510: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
e520: 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
e530: 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
e540: 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
e550: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
e560: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
e570: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
e580: 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
e590: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
e5a0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
e5b0: 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
e5c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
e5d0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
e5e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
e5f0: 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
e600: 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
e610: 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
e620: 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
e630: 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
e640: 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
e650: 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
e660: 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
e670: 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
e680: 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
e690: 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
e6a0: 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
e6b0: 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
e6c0: 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
e6d0: 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
e6e0: 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
e6f0: 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
e700: 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
e710: 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
e720: 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
e730: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
e740: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
e750: 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
e760: 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
e770: 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
e780: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
e790: 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61  geSize)!=0 || pa
e7a0: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20  geSize<512 ||.  
e7b0: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41        (SQLITE_MA
e7c0: 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36  X_PAGE_SIZE<3276
e7d0: 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51  8 && pageSize>SQ
e7e0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
e7f0: 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ZE).    ){.     
e800: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
e810: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
e820: 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
e830: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
e840: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
e850: 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
e860: 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
e870: 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
e880: 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
e890: 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
e8a0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
e8b0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
e8c0: 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
e8d0: 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
e8e0: 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
e8f0: 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
e900: 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
e910: 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
e920: 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
e930: 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
e940: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
e950: 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
e960: 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
e970: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
e980: 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
e990: 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
e9a0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
e9b0: 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
e9c0: 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
e9d0: 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
e9e0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
e9f0: 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
ea00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
ea10: 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
ea20: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
ea30: 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
ea40: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
ea50: 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
ea60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
ea70: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
ea80: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
ea90: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
eaa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
eab0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
eac0: 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30  f( usableSize<50
ead0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
eae0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
eaf0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  d;.    }.    pBt
eb00: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
eb10: 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
eb20: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
eb30: 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a  = (u16)usableSiz
eb40: 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
eb50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
eb60: 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
eb70: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
eb80: 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
eb90: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
eba0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
ebb0: 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
ebc0: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
ebd0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
ebe0: 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
ebf0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
ec00: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
ec10: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
ec20: 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
ec30: 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
ec40: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
ec50: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
ec60: 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
ec70: 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
ec80: 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
ec90: 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
eca0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
ecb0: 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
ecc0: 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
ecd0: 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
ece0: 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
ecf0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
ed00: 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
ed10: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
ed20: 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
ed30: 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
ed40: 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
ed50: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
ed60: 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
ed70: 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
ed80: 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
ed90: 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
eda0: 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65   poiner, a heade
edb0: 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
edc0: 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
edd0: 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
ede0: 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
edf0: 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
ee00: 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
ee10: 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
ee20: 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
ee30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42  ->maxLocal = (pB
ee40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
ee50: 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20  )*64/255 - 23;. 
ee60: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
ee70: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
ee80: 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
ee90: 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  3;.  pBt->maxLea
eea0: 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  f = pBt->usableS
eeb0: 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d  ize - 35;.  pBt-
eec0: 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d  >minLeaf = (pBt-
eed0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
eee0: 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61  32/255 - 23;.  a
eef0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
ef00: 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
ef10: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
ef20: 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
ef30: 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72   pPage1;.  retur
ef40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
ef50: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
ef60: 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
ef70: 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
ef80: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
ef90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
efa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
efb0: 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72  rks like lockBtr
efc0: 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74  ee() except that
efd0: 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73   it also invokes
efe0: 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c   the.** busy cal
eff0: 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69  lback if there i
f000: 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  s lock contentio
f010: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
f020: 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
f030: 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29  try(Btree *pRef)
f040: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f050: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
f060: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
f070: 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29 20  oldsMutex(pRef) 
f080: 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69  );.  if( pRef->i
f090: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
f0a0: 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54  NE ){.    u8 inT
f0b0: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65  ransaction = pRe
f0c0: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
f0d0: 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65  ction;.    btree
f0e0: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
f0f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f100: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
f110: 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70  (pRef, 0);.    p
f120: 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
f130: 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e  saction = inTran
f140: 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65  saction;.    pRe
f150: 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  f->inTrans = TRA
f160: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28  NS_NONE;.    if(
f170: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f180: 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42  {.      pRef->pB
f190: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
f1a0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  -;.    }.    btr
f1b0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
f1c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f1d0: 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f  rc;.}.       ../
f1e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
f1f0: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
f200: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
f210: 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
f220: 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
f230: 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
f240: 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
f250: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
f260: 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
f270: 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
f280: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
f290: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f2a0: 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
f2b0: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
f2c0: 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
f2d0: 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
f2e0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
f2f0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
f300: 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ors, this routin
f310: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
f320: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
f330: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
f340: 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
f350: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
f360: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
f370: 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
f380: 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
f390: 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
f3a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f3b0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
f3c0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
f3d0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
f3e0: 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
f3f0: 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42  pCursor==0 && pB
f400: 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
f410: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
f420: 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
f430: 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a  ->pPager)>=1 ){.
f440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
f450: 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
f460: 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20   );.#if 0.      
f470: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  if( pBt->pPage1-
f480: 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20  >aData==0 ){.   
f490: 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
f4a0: 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  age = pBt->pPage
f4b0: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  1;.        pPage
f4c0: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
f4d0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
f4e0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
f4f0: 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42         pPage->pB
f500: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
f510: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31   pPage->pgno = 1
f520: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f530: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
f540: 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
f550: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
f560: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
f570: 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
f580: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
f590: 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62  eate a new datab
f5a0: 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
f5b0: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
f5c0: 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ge of the.** fil
f5d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f5e0: 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
f5f0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
f600: 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
f610: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
f620: 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ta;.  int rc;.  
f630: 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73  int nPage;..  as
f640: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f650: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f660: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
f670: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
f680: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
f690: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  , &nPage);.  if(
f6a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
f6b0: 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  | nPage>0 ){.   
f6c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f6d0: 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
f6e0: 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
f6f0: 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
f700: 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
f710: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f720: 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
f730: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
f740: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
f750: 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
f760: 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
f770: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
f780: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f790: 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
f7a0: 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  16 );.  put2byte
f7b0: 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d  (&data[16], pBt-
f7c0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
f7d0: 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
f7e0: 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
f7f0: 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
f800: 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
f810: 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
f820: 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
f830: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
f840: 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
f850: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
f860: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
f870: 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
f880: 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
f890: 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
f8a0: 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
f8b0: 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
f8c0: 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
f8d0: 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
f8e0: 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
f8f0: 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70  DATA );.  pBt->p
f900: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
f910: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f920: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
f930: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
f940: 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
f950: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f960: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
f970: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f980: 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
f990: 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
f9a0: 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
f9b0: 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
f9c0: 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
f9d0: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
f9e0: 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
f9f0: 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
fa00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fa10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  OK;.}../*.** Att
fa20: 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
fa30: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
fa40: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
fa50: 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
fa60: 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
fa70: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
fa80: 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
fa90: 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
faa0: 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
fab0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
fac0: 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
fad0: 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
fae0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
faf0: 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
fb00: 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
fb10: 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
fb20: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
fb30: 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
fb40: 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
fb50: 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
fb60: 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
fb70: 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
fb80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fb90: 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
fba0: 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
fbb0: 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
fbc0: 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
fbd0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
fbe0: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
fbf0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
fc00: 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
fc10: 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
fc20: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
fc30: 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
fc40: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
fc50: 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
fc60: 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
fc70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
fc80: 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
fc90: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
fca0: 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
fcb0: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
fcc0: 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
fcd0: 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
fce0: 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
fcf0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
fd00: 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
fd10: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
fd20: 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
fd30: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
fd40: 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
fd50: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
fd60: 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
fd70: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
fd80: 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
fd90: 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
fda0: 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
fdb0: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
fdc0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
fdd0: 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
fde0: 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
fdf0: 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
fe00: 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
fe10: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
fe20: 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
fe30: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
fe40: 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
fe50: 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
fe60: 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
fe70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
fe80: 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
fe90: 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
fea0: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
feb0: 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
fec0: 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
fed0: 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
fee0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
fef0: 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
ff00: 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
ff10: 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
ff20: 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
ff30: 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
ff40: 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
ff50: 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
ff60: 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
ff70: 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
ff80: 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
ff90: 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
ffa0: 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
ffb0: 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
ffc0: 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
ffd0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
ffe0: 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
fff0: 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
10000 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
10010 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
10020 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
10030 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
10040 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
10050 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
10060 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
10070 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
10080 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
10090 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
100a0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
100b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
100c0 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
100d0 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
100e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f  .  sqlite3 *pBlo
100f0 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ck = 0;.  BtShar
10100 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
10110 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
10120 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
10130 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
10140 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
10150 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
10160 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
10170 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
10180 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
10190 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
101a0 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
101b0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
101c0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
101d0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
101e0 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
101f0 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
10200 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
10210 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
10220 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
10230 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
10240 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
10250 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
10260 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
10270 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
10280 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
10290 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
102a0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
102b0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61  /.  if( pBt->rea
102c0 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20  dOnly && wrflag 
102d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
102e0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
102f0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
10300 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
10310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10320 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
10330 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
10340 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
10350 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
10360 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
10370 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
10380 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
10390 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
103a0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
103b0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
103c0 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
103d0 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a  LITE_LOCKED..  *
103e0 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20  /.  if( (wrflag 
103f0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
10400 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
10410 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65  TE) || pBt->isPe
10420 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c  nding ){.    pBl
10430 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
10440 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20  er->db;.  }else 
10450 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
10460 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
10470 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
10480 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
10490 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
104a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
104b0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
104c0 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=p ){.        p
104d0 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70  Block = pIter->p
104e0 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
104f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10500 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
10510 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
10520 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
10530 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
10540 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  pBlock);.    rc 
10550 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
10560 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
10570 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
10580 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
10590 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42   do {.    if( pB
105a0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
105b0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
105c0 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
105d0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77 68  (pBt);.      }wh
105e0 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
105f0 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
10600 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  E_OK );.    }.. 
10610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10620 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
10630 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
10640 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
10650 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10660 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
10670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10680 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10690 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
106a0 65 72 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20  er, wrflag>1);. 
106b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
106c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
106d0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
106e0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
106f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10700 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
10710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10720 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
10730 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  g ) pBt->inStmt 
10740 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
10750 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
10760 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
10770 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
10780 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
10790 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
107a0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
107b0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
107c0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
107d0 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
107e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
107f0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
10800 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
10810 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
10820 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
10830 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  +;.    }.    p->
10840 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
10850 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
10860 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
10870 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
10880 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10890 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
108a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
108b0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
108c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
108d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
108e0 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
108f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
10900 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
10910 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
10920 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
10930 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
10940 65 20 3d 20 28 77 72 66 6c 61 67 3e 31 29 3b 0a  e = (wrflag>1);.
10950 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10960 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
10970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10980 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
10990 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
109a0 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
109b0 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
109c0 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
109d0 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
109e0 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
109f0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
10a00 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
10a10 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
10a20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
10a30 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
10a40 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
10a50 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
10a60 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
10a70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10a80 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
10a90 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
10aa0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
10ab0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
10ac0 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
10ad0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10ae0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10af0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10b00 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
10b10 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
10b20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
10b30 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
10b40 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
10b50 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
10b60 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
10b70 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
10b80 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
10b90 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
10ba0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
10bb0 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
10bc0 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
10bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10be0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
10bf0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
10c00 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
10c30 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
10c40 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10c70 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
10c80 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10cb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
10cc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10cd0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
10ce0 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
10cf0 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
10d00 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
10d10 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
10d20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10d30 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
10d40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
10d50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
10d60 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
10d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10d80 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
10d90 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
10da0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
10db0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
10dc0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
10dd0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
10de0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
10df0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
10e00 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
10e10 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
10e20 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
10e30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10e40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
10e50 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
10e60 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
10e70 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
10e80 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
10e90 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
10ea0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
10eb0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
10ec0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
10ed0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
10ee0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
10ef0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10f00 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
10f10 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
10f20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
10f30 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
10f40 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
10f50 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
10f60 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
10f70 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
10f80 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
10f90 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
10fa0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
10fb0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74   pgno);.  }..set
10fc0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
10fd0 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
10fe0 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
10ff0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11000 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
11010 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63  e on pPage, whic
11020 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  h is guarenteed 
11030 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61  to be a btree pa
11040 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66  ge, not an overf
11050 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20  low.** page, is 
11060 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
11070 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20  e iFrom. Modify 
11080 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20  this pointer so 
11090 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
110a0 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65  o.** iTo. Parame
110b0 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
110c0 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
110d0 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f  pointer to be mo
110e0 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66  dified, as .** f
110f0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
11100 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
11110 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
11120 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
11130 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
11140 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
11150 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
11160 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
11170 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
11180 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
11190 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
111a0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
111b0 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
111e0 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
111f0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
11200 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
11210 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
11220 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
11230 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
11240 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
11250 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11260 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
11270 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
11280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
11290 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
112a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
112b0 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
112c0 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
112d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
112e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
112f0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
11300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11310 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
11320 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
11330 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
11340 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
11350 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
11360 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
11370 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
11380 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
11390 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
113a0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
113b0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
113c0 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
113d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
113e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
113f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
11400 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
11410 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
11420 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
11430 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
11440 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
11450 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
11460 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11470 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
11480 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
11490 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
114a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
114b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
114c0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
114d0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
114e0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
114f0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
11500 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
11510 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
11520 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
11530 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
11540 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
11550 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
11560 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
11570 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
11580 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
11590 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
115a0 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ow]) ){.        
115b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
115c0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
115d0 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
115e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
115f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11600 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
11610 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
11620 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
11630 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
11640 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
11650 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
11660 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
11670 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11680 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
11690 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
116a0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
116b0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
116c0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
116d0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
116e0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
116f0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
11700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11710 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11720 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
11730 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
11740 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
11750 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
11760 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
11770 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
11780 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
11790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
117a0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
117b0 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
117c0 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
117d0 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
117e0 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
117f0 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
11800 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
11810 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61  ns valid..*/.sta
11820 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
11830 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
11840 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
11850 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
11860 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
11870 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
11880 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
11890 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
118a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
118b0 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
118c0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
118d0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
118e0 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
118f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
11900 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
11910 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
11920 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
11930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11940 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
11950 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
11960 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29    int isCommit.)
11970 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
11980 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
11990 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
119a0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
119b0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
119c0 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
119d0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
119e0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
119f0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
11a00 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
11a10 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
11a20 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
11a30 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
11a40 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
11a50 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
11a60 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
11a70 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
11a80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11a90 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
11aa0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
11ab0 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
11ac0 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
11ad0 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
11ae0 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
11af0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
11b00 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
11b10 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
11b20 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
11b30 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
11b40 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
11b50 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
11b60 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
11b70 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
11b80 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
11b90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11ba0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
11bb0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
11bc0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
11bd0 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
11be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11bf0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11c00 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
11c10 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
11c20 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
11c30 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
11c40 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
11c50 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
11c60 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
11c70 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
11c80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
11c90 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
11ca0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
11cb0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
11cc0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
11cd0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
11ce0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
11cf0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
11d00 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
11d10 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
11d20 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
11d30 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
11d40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
11d50 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
11d60 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
11d70 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
11d80 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
11d90 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
11da0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
11db0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
11dc0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
11dd0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
11de0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
11df0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
11e00 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
11e10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11e30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11e40 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
11e50 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
11e60 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
11e70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
11e80 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
11e90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
11ea0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
11eb0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
11ec0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
11ed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11f10 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
11f20 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
11f30 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
11f40 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
11f50 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
11f60 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
11f70 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
11f80 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
11f90 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
11fa0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
11fb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
11fc0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
11fd0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
11fe0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
11ff0 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
12000 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
12010 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12030 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12040 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12050 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
12060 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
12070 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12080 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12090 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
120a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
120b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
120c0 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
120d0 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
120e0 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
120f0 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
12100 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
12110 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
12120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12130 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
12140 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
12150 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
12160 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  PtrPage);.    }.
12170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12180 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
12190 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
121a0 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
121b0 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
121c0 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
121d0 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
121e0 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
121f0 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
12200 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
12210 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
12220 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
12230 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
12240 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74  ccessful,.** ret
12250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
12260 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
12270 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
12280 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f  erefore no.** po
12290 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74  int in calling t
122a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
122b0 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
122c0 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d  TE_DONE..**.** M
122d0 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
122e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
122f0 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
12300 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61  anize the .** da
12310 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
12320 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
12330 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
12340 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20  ly in use.** is 
12350 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
12360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
12370 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  Fin parameter is
12380 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69   non-zero, the i
12390 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73  mplementation as
123a0 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  sumes.** that th
123b0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  e caller will ke
123c0 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
123d0 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
123e0 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20  l.** it returns 
123f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
12400 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61  n error, and tha
12410 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a  t nFin is the.**
12420 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
12430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12440 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  le will contain 
12450 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70  after this .** p
12460 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65  rocess is comple
12470 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
12480 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
12490 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
124a0 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
124b0 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f  iLastPg){.  Pgno
124c0 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
124d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
124e0 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
124f0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
12500 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
12510 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12520 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12530 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
12540 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
12550 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
12560 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
12570 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e  E(pBt) ){.    in
12580 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79  t rc;.    u8 eTy
12590 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
125a0 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
125b0 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
125c0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
125d0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
125e0 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
125f0 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67  || nFin==iLastPg
12600 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
12610 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
12620 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
12630 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
12640 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
12650 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
12660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12670 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12680 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
12690 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
126a0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
126b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
126c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
126d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
126e0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
126f0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
12700 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
12710 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
12720 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
12730 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
12740 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
12750 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
12760 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d   if nFin is non-
12770 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
12780 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
12790 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
127a0 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
127b0 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
127c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
127d0 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
127e0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
127f0 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
12800 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
12810 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
12820 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12830 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
12840 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
12850 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
12860 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
12870 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
12880 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
12890 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a  g, iLastPg, 1);.
128a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
128b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
128c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
128d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
128e0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
128f0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
12900 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
12910 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
12920 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
12930 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
12940 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
12950 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
12960 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
12970 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
12980 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
12990 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63  astPg;..      rc
129a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
129b0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
129c0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
129d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
129e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
129f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12a00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
12a10 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
12a20 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
12a30 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
12a40 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
12a50 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
12a60 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
12a70 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
12a80 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
12a90 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
12aa0 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
12ab0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
12ac0 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
12ad0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
12ae0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
12af0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
12b00 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
12b10 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
12b20 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
12b30 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
12b40 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
12b50 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
12b60 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
12b70 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
12b80 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
12b90 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
12ba0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
12bb0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
12bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12bd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
12be0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
12bf0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
12c00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12c10 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
12c20 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
12c30 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
12c40 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
12c50 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
12c60 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
12c70 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
12c80 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
12c90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
12ca0 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
12cb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
12cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12cd0 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
12ce0 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
12cf0 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
12d00 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
12d10 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  nFin!=0);.      
12d20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
12d30 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
12d40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12d50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12d70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12d80 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
12d90 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
12da0 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50     while( iLastP
12db0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
12dc0 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
12dd0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
12de0 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
12df0 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
12e00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
12e10 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
12e20 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73  Bt->pPager, iLas
12e30 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tPg);.  }.  retu
12e40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12e50 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
12e60 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
12e70 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
12e80 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
12e90 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
12ea0 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
12eb0 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
12ec0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
12ed0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
12ee0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
12ef0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
12f00 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
12f10 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
12f20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
12f30 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
12f40 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
12f50 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
12f60 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
12f70 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
12f80 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
12f90 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
12fa0 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
12fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
12fc0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
12fd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
12fe0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
12ff0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
13000 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13010 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
13020 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  b;.  assert( pBt
13030 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13040 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
13050 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13060 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
13070 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
13080 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
13090 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
130a0 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  se{.    invalida
130b0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
130c0 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  he(pBt);.    rc 
130d0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
130e0 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50 61  (pBt, 0, pagerPa
130f0 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20  gecount(pBt));. 
13100 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
13110 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13120 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13130 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13140 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
13150 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
13160 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
13170 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
13180 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
13190 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
131a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
131b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
131c0 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
131d0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
131e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
131f0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
13200 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
13210 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
13220 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
13230 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
13240 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
13250 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
13260 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
13270 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
13280 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
13290 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
132a0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
132b0 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
132c0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
132d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
132e0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
132f0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
13300 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
13310 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
13320 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
13330 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
13340 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
13360 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
13370 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
13380 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
13390 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
133a0 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
133b0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
133c0 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Fin;.    Pgno nF
133d0 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  ree;.    Pgno nP
133e0 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f 20  trmap;.    Pgno 
133f0 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74  iFree;.    const
13400 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d   int pgsz = pBt-
13410 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 50  >pageSize;.    P
13420 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67 65  gno nOrig = page
13430 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
13440 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ..    if( PTRMAP
13450 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
13460 69 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ig) ){.      ret
13470 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
13480 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
13490 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45     if( nOrig==PE
134a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
134b0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 4f  pBt) ){.      nO
134c0 72 69 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rig--;.    }.   
134d0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
134e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
134f0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
13500 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
13510 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
13520 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
13530 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35  +pgsz/5)/(pgsz/5
13540 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f  );.    nFin = nO
13550 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
13560 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e  trmap;.    if( n
13570 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
13580 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
13590 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
135a0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
135b0 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
135c0 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54   }.    while( PT
135d0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
135e0 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
135f0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
13600 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
13610 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20  nFin--;.    }.. 
13620 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
13630 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
13640 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
13650 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
13660 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
13670 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
13680 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iFree);.    }.  
13690 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
136a0 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
136b0 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
136c0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
136d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
136e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
136f0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
13700 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
13710 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
13720 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
13730 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
13740 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
13750 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
13760 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  36], 0);.      s
13770 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
13780 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
13790 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  ager, nFin);.   
137a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
137b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
137c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
137d0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
137e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
137f0 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
13800 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
13810 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
13820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
13830 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
13840 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13850 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  UM */../*.** Thi
13860 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
13870 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
13880 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
13890 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
138a0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
138b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
138c0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
138d0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
138e0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
138f0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
13900 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
13910 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
13920 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
13930 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
13940 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
13950 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
13960 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
13970 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
13980 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
13990 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
139a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
139b0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
139c0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
139d0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
139e0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
139f0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
13a00 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
13a10 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
13a20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
13a30 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
13a40 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
13a50 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
13a60 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
13a70 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
13a80 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
13a90 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
13aa0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
13ab0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
13ac0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13ad0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
13ae0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
13af0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
13b00 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
13b10 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
13b20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
13b30 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
13b40 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
13b50 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
13b60 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
13b70 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
13b80 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
13b90 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
13ba0 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
13bb0 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
13bc0 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
13bd0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
13be0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13bf0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
13c00 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
13c10 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
13c20 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
13c30 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
13c40 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
13c50 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
13c60 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
13c70 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
13c80 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
13c90 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
13ca0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
13cb0 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
13cc0 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
13cd0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
13ce0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
13cf0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
13d00 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
13d10 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
13d20 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
13d30 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
13d40 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
13d50 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
13d60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
13d70 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
13d80 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
13d90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
13da0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13db0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
13dc0 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
13dd0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
13de0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13df0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
13e00 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
13e10 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
13e20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13e30 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
13e40 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
13e50 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
13e60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13e70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13e80 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
13e90 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
13ea0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
13eb0 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
13ec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13ee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13ef0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
13f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13f10 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
13f20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13f30 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
13f40 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
13f50 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
13f60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13f70 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
13f80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13f90 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
13fa0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
13fb0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
13fc0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13fd0 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
13fe0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
13ff0 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
14000 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
14010 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
14020 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
14030 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
14040 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
14050 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
14060 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
14070 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
14080 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
14090 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68  ne did.** all th
140a0 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
140b0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
140c0 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
140d0 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
140e0 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
140f0 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
14100 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
14110 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
14120 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
14130 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
14140 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
14150 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
14160 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65  .** (which cause
14170 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
14180 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
14190 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
141a0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
141b0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
141c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
141d0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
141e0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
141f0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
14200 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
14210 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
14220 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14230 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
14240 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
14250 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14260 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
14270 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14280 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
14290 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
142a0 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
142b0 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
142c0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
142d0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
142e0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
142f0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
14300 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
14310 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
14320 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
14330 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
14340 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
14350 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
14360 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
14370 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14380 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
14390 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
143a0 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
143b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
143c0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
143d0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
143e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
143f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14400 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14410 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
14420 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14430 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14440 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
14450 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
14460 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 63 6c 65  t = 0;.  }.  cle
14470 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
14480 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 0a  TableLocks(p);..
14490 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
144a0 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20  le has any kind 
144b0 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
144c0 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
144d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
144e0 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
144f0 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
14500 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
14510 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  n count reaches 
14520 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20  0, set.  ** the 
14530 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
14540 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
14550 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14560 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77  sed() call below
14570 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63  .  ** will unloc
14580 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  k the pager..  *
14590 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
145a0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
145b0 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  {.    pBt->nTran
145c0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
145d0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
145e0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
145f0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14600 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
14610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14620 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65  * Set the handle
14630 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  s current transa
14640 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
14650 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
14660 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61  lock.  ** the pa
14670 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
14680 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
14690 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
146a0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
146b0 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  .  btreeClearHas
146c0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
146d0 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
146e0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63  NS_NONE;.  unloc
146f0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
14700 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
14710 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
14720 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14730 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
14740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14750 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
14760 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
14770 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
14780 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
14790 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
147a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
147b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
147c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
147d0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
147e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
147f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14800 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
14810 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20  aseTwo(p);.  }. 
14820 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14830 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
14840 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
14850 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
14860 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
14870 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f   write-cursors o
14880 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64  pen on this hand
14890 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  le. This is for 
148a0 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
148b0 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
148c0 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
148d0 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
148e0 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
148f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
14900 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
14910 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72  is routine, a wr
14920 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e  ite-cursor is an
14930 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
14940 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77   is capable of w
14950 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
14960 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61  tabse.  That mea
14970 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  ns the cursor wa
14980 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20  s.** originally 
14990 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
149a0 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ng and the curso
149b0 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73  r has not be dis
149c0 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69  abled.** by havi
149d0 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61  ng its state cha
149e0 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46  nged to CURSOR_F
149f0 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  AULT..*/.static 
14a00 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75  int countWriteCu
14a10 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
14a20 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
14a30 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
14a40 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
14a50 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
14a60 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
14a70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
14a80 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
14a90 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
14aa0 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
14ab0 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
14ac0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
14ad0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
14ae0 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
14af0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
14b00 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
14b10 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
14b20 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
14b30 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74  on BtShared that
14b40 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
14b50 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  ences..**.** Eve
14b60 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69  ry cursor is tri
14b70 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
14b80 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c  cursors that bel
14b90 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20  ong.** to other 
14ba0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14bb0 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
14bc0 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a   to be sharing.*
14bd0 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  * the cache with
14be0 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
14bf0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
14c00 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
14c10 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a  ollback occurs..
14c20 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75  ** All cursors u
14c30 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61  sing the same ca
14c40 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70  che must be trip
14c50 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e  ped.** to preven
14c60 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69  t them from tryi
14c70 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74  ng to use the bt
14c80 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ree after.** the
14c90 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
14ca0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
14cb0 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73  e deleted tables
14cc0 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f  .** or moved roo
14cd0 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69  t pages, so it i
14ce0 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
14cf0 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20   to.** save the 
14d00 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
14d10 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  sor.  The cursor
14d20 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
14d30 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  lidated..*/.void
14d40 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
14d50 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
14d60 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
14d70 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72  rrCode){.  BtCur
14d80 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  sor *p;.  sqlite
14d90 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
14da0 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
14db0 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
14dc0 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
14dd0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
14de0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
14df0 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
14e00 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
14e10 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
14e20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64  p->skip = errCod
14e30 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
14e40 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
14e50 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
14e60 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69  Page(p->apPage[i
14e70 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50  ]);.      p->apP
14e80 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
14e90 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
14ea0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
14eb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
14ec0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
14ed0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
14ee0 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
14ef0 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
14f00 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
14f10 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
14f20 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
14f30 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
14f40 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
14f50 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
14f60 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
14f70 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
14f80 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
14f90 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
14fa0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
14fb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14fc0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
14fd0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
14fe0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
14ff0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
15000 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
15010 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15020 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
15030 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
15040 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15050 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
15060 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1;..  sqlite3Btr
15070 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
15080 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
15090 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
150a0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
150b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
150c0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
150d0 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
150e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
150f0 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
15100 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
15110 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
15120 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
15130 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79  hilst.    ** try
15140 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73  ing to save curs
15150 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66  or positions. If
15160 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
15170 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28  matic rollback (
15180 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  as.    ** the re
15190 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72  sult of a constr
151a0 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66  aint, malloc() f
151b0 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72  ailure or IO err
151c0 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  or) then .    **
151d0 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62   the cache may b
151e0 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63  e internally inc
151f0 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63  onsistent (not c
15200 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65  ontain valid tre
15210 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65  es) so.    ** we
15220 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72   cannot simply r
15230 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
15240 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49  to the caller. I
15250 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20  nstead, abort . 
15260 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65     ** all querie
15270 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  s that may be us
15280 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63  ing any of the c
15290 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c  ursors that fail
152a0 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20  ed to save..    
152b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
152c0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
152d0 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65  s(p, rc);.  }.#e
152e0 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65  ndif.  btreeInte
152f0 67 72 69 74 79 28 70 29 3b 0a 20 20 63 6c 65 61  grity(p);.  clea
15300 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
15310 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 0a 20  ableLocks(p);.. 
15320 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
15330 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
15340 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
15350 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
15360 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
15370 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
15380 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
15390 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
153a0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
153b0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
153c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
153d0 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
153e0 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
153f0 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
15400 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
15410 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
15420 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74     ** call sqlit
15430 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29  e3BtreeGetPage()
15440 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
15450 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
15460 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
15470 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
15480 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
15490 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
154a0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
154b0 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
154c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
154d0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
154e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
154f0 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
15500 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
15510 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
15520 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
15530 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  EAD;.  }..  if( 
15540 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
15550 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73  S_NONE ){.    as
15560 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
15570 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
15580 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15590 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
155a0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
155b0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
155c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
155d0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
155e0 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 43   }.  }..  btreeC
155f0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
15600 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  Bt);.  p->inTran
15610 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
15620 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
15630 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  0;.  unlockBtree
15640 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
15650 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
15660 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
15670 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15680 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15690 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
156a0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
156b0 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
156c0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
156d0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
156e0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
156f0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
15700 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
15710 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
15720 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
15730 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
15740 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
15750 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
15760 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
15770 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
15780 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
15790 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
157a0 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
157b0 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
157c0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
157d0 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
157e0 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
157f0 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
15800 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
15810 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
15820 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
15830 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
15840 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
15850 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
15860 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
15870 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
15880 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
15890 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
158a0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
158b0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
158c0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
158d0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
158e0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
158f0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
15900 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
15910 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
15920 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
15930 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
15940 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
15950 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
15960 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
15970 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
15980 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
15990 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
159a0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
159b0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
159c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
159d0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
159e0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
159f0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
15a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
15a10 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 61  t->inStmt );.  a
15a20 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64  ssert( pBt->read
15a30 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Only==0 );.  if(
15a40 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e   NEVER(p->inTran
15a50 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s!=TRANS_WRITE |
15a60 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 7c 7c  | pBt->inStmt ||
15a70 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
15a80 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
15a90 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d  TE_INTERNAL;.  }
15aa0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
15ab0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
15ac0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
15ad0 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74  E );.    /* At t
15ae0 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
15af0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
15b00 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
15b10 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20  epoint with.    
15b20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
15b30 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
15b40 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
15b50 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
15b60 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  .    ** SQL stat
15b70 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
15b80 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
15b90 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
15ba0 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  ck any.    ** su
15bb0 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
15bc0 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
15bd0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
15be0 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
15bf0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
15c00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
15c10 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
15c20 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
15c30 3e 6e 53 61 76 65 70 6f 69 6e 74 2b 31 29 3b 0a  >nSavepoint+1);.
15c40 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
15c50 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
15c60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15c70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15c80 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
15c90 65 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72  e statment subtr
15ca0 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
15cb0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
15cc0 20 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72    If no.** subtr
15cd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
15ce0 69 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ive, this is a n
15cf0 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
15d00 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
15d10 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
15d20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15d30 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
15d40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15d50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15d60 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
15d70 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
15d80 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15d90 53 5f 57 52 49 54 45 20 26 26 20 70 42 74 2d 3e  S_WRITE && pBt->
15da0 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e  inStmt ){.    in
15db0 74 20 69 53 74 6d 74 70 6f 69 6e 74 20 3d 20 70  t iStmtpoint = p
15dc0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
15dd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
15de0 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  t->readOnly==0 )
15df0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15e00 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
15e10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 41  (pBt->pPager, SA
15e20 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
15e30 20 69 53 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20   iStmtpoint);.  
15e40 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
15e50 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
15e60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15e80 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
15e90 65 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  e active stateme
15ea0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
15eb0 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61  n.  If no subtra
15ec0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  nsaction.** is a
15ed0 63 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69  ctive this routi
15ee0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
15ef0 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  *.** All cursors
15f00 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64   will be invalid
15f10 61 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ated by this ope
15f20 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
15f30 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61  empt.** to use a
15f40 20 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73   cursor that was
15f50 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
15f60 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
15f70 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  peration.** will
15f80 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
15f90 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ror..*/.int sqli
15fa0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15fb0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  Stmt(Btree *p){.
15fc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15fd0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
15fe0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15ff0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16000 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
16010 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
16020 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
16030 4e 53 5f 57 52 49 54 45 20 26 26 20 70 42 74 2d  NS_WRITE && pBt-
16040 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  >inStmt ){.    i
16050 6e 74 20 69 53 74 6d 74 70 6f 69 6e 74 20 3d 20  nt iStmtpoint = 
16060 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
16070 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
16080 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
16090 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
160a0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
160b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  t(pBt->pPager, S
160c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
160d0 4b 2c 20 69 53 74 6d 74 70 6f 69 6e 74 29 3b 0a  K, iStmtpoint);.
160e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
160f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16100 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16110 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
16120 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54  Pager, SAVEPOINT
16130 5f 52 45 4c 45 41 53 45 2c 20 69 53 74 6d 74 70  _RELEASE, iStmtp
16140 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
16150 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
16160 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
16170 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16190 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
161a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
161b0 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
161c0 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
161d0 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
161e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
161f0 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
16200 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
16210 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
16220 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
16230 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
16240 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
16250 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
16260 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
16270 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
16280 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
16290 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
162a0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
162b0 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
162c0 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
162d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
162e0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
162f0 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
16300 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
16310 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
16320 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
16330 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
16340 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
16350 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
16360 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
16370 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
16380 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
16390 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
163a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
163b0 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
163c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
163d0 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
163e0 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
163f0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
16400 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16410 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
16420 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
16430 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
16440 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16450 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
16460 20 70 42 74 2d 3e 69 6e 53 74 6d 74 3d 3d 30 20   pBt->inStmt==0 
16470 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
16480 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
16490 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
164a0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
164b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
164c0 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
164d0 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
164e0 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
164f0 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
16500 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16510 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e  er(p);.    pBt->
16520 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
16530 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16540 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
16550 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
16560 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
16570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16580 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  {.      rc = new
16590 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
165a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
165b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
165c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
165d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
165e0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
165f0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
16600 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
16610 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
16620 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75   The act of acqu
16630 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67  iring a cursor g
16640 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ets a read lock 
16650 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  on .** the datab
16660 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
16670 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
16680 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
16690 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
166a0 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
166b0 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
166c0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
166d0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
166e0 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
166f0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
16700 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
16710 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
16720 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
16730 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
16740 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
16750 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
16760 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
16770 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
16780 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
16790 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
167a0 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
167b0 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
167c0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
167d0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
167e0 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
167f0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
16800 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
16810 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
16820 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
16830 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
16840 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
16850 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
16860 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
16870 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
16880 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
16890 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
168a0 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
168b0 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
168c0 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
168d0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
168e0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
168f0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
16900 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
16910 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
16920 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
16930 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
16940 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
16950 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
16960 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
16970 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
16980 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
16990 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
169a0 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
169b0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
169c0 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
169d0 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
169e0 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
169f0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
16a00 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
16a10 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
16a20 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
16a30 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
16a40 28 29 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  () bytes of memo
16a50 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  ry .** pointed t
16a60 6f 20 62 79 20 70 43 75 72 20 68 61 76 65 20 62  o by pCur have b
16a70 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68  een zeroed by th
16a80 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
16a90 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
16aa0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ad0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
16ae0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
16b10 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
16b20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
16b30 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b50 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
16b60 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
16b70 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
16b80 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
16b90 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
16ba0 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
16bb0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
16bc0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16be0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
16bf0 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
16c00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
16c10 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20    Pgno nPage;.  
16c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16c30 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
16c40 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
16c50 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
16c60 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
16c70 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
16c80 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   );.  if( wrFlag
16c90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16ca0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
16cb0 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
16cc0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  pBt->readOnly) )
16cd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
16ce0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
16cf0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
16d00 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c  heckForReadConfl
16d10 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 2c 20  icts(p, iTable, 
16d20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
16d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16d40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
16d50 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  ==SQLITE_LOCKED_
16d60 53 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20  SHAREDCACHE );. 
16d70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16d80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
16d90 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
16da0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  ){.    rc = lock
16db0 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
16dc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16df0 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
16e00 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
16e10 69 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73  iTable;.  rc = s
16e20 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
16e30 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
16e40 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 29  , (int *)&nPage)
16e50 3b 20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ; .  if( rc!=SQL
16e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16e70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
16e80 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
16e90 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
16ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
16eb0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  Y;.    goto crea
16ec0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
16ed0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ion;.  }.  rc = 
16ee0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
16ef0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
16f00 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
16f10 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72 63 21  e[0]);.  if( rc!
16f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16f30 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
16f40 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
16f50 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
16f60 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
16f70 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
16f80 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
16f90 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
16fa0 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e  * variables, lin
16fb0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
16fc0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
16fd0 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43  ist and set *ppC
16fe0 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74  ur (the.  ** out
16ff0 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  put argument to 
17000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a  this function)..
17010 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65    */.  pCur->pKe
17020 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
17030 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
17040 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
17050 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
17060 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72  >wrFlag = (u8)wr
17070 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  Flag;.  pCur->pN
17080 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
17090 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
170a0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
170b0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
170c0 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42  = pCur;.  }.  pB
170d0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
170e0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
170f0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
17100 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68  ID;.  pCur->cach
17110 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20  edRowid = 0;..  
17120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17130 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72  ;..create_cursor
17140 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65  _exception:.  re
17150 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
17160 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e  apPage[0]);.  un
17170 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
17180 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  d(pBt);.  return
17190 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
171a0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
171b0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
171e0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
171f0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
17220 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
17230 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
17240 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
17270 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
17280 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
17290 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
172a0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
172b0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
172c0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
172d0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
172e0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
17310 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
17320 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
17330 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17340 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20  );.  p->pBt->db 
17350 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20  = p->db;.  rc = 
17360 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
17370 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
17380 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
17390 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
173a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
173b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
173c0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
173d0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
173e0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
173f0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
17400 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
17410 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
17420 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
17430 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
17440 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
17450 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
17460 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
17470 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
17480 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
17490 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
174a0 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
174b0 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
174c0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
174d0 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
174e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
174f0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
17500 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73  rn sizeof(BtCurs
17510 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  or);.}../*.** Se
17520 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  t the cached row
17530 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  id value of ever
17540 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20  y cursor in the 
17550 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
17560 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e  le.** as pCur an
17570 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d  d having the sam
17580 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
17590 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65  er as pCur.  The
175a0 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
175b0 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a   to iRowid..**.*
175c0 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20  * Only positive 
175d0 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65  rowid values are
175e0 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69   considered vali
175f0 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65  d for this cache
17600 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69  ..** The cache i
17610 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
17620 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e   zero, indicatin
17630 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63  g an invalid cac
17640 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77  he..** A btree w
17650 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69  ill work fine wi
17660 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  th zero or negat
17670 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20  ive rowids.  We 
17680 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63  just cannot.** c
17690 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67  ache zero or neg
176a0 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68  ative rowids, wh
176b0 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73  ich means tables
176c0 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f   that use zero o
176d0 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f  r.** negative ro
176e0 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61  wids might run a
176f0 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
17700 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65   But in practice
17710 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67  , zero.** or neg
17720 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65  ative rowids are
17730 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73   very uncommon s
17740 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  o this should no
17750 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
17760 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
17770 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77  treeSetCachedRow
17780 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
17790 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
177a0 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75   iRowid){.  BtCu
177b0 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
177c0 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72  =pCur->pBt->pCur
177d0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
177e0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
177f0 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e  pgnoRoot==pCur->
17800 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61  pgnoRoot ) p->ca
17810 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77  chedRowid = iRow
17820 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  id;.  }.  assert
17830 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  ( pCur->cachedRo
17840 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d  wid==iRowid );.}
17850 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17860 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
17870 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75  for the given cu
17880 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76  rsor.  A negativ
17890 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74  e or zero.** ret
178a0 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
178b0 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77  tes that the row
178c0 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61  id cache is inva
178d0 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
178e0 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49  e.** ignored.  I
178f0 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  f the rowid cach
17900 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  e has never befo
17910 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65  re been set, the
17920 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72  n a.** zero is r
17930 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69  eturned..*/.sqli
17940 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
17950 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52  3BtreeGetCachedR
17960 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
17970 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
17980 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
17990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
179a0 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
179b0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
179c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
179d0 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
179e0 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
179f0 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
17a00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17a10 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
17a20 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
17a30 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
17a40 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
17a50 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
17a60 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53    int i;.    BtS
17a70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
17a80 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
17a90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
17aa0 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  tree);.    pBt->
17ab0 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b  db = pBtree->db;
17ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
17ad0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
17ae0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r);.    if( pCur
17af0 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
17b00 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e   pCur->pPrev->pN
17b10 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
17b20 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
17b30 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
17b40 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
17b50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
17b60 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
17b70 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
17b80 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50  pPrev = pCur->pP
17b90 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  rev;.    }.    f
17ba0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
17bb0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
17bc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17bd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
17be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
17bf0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
17c00 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69  pBt);.    invali
17c10 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
17c20 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20  e(pCur);.    /* 
17c30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
17c40 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
17c50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
17c60 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
17c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17c80 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65  ./*.** Make a te
17c90 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62  mporary cursor b
17ca0 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  y filling in the
17cb0 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70   fields of pTemp
17cc0 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70  Cur..** The temp
17cd0 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20  orary cursor is 
17ce0 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f  not on the curso
17cf0 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42  r list for the B
17d00 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
17d10 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d  lite3BtreeGetTem
17d20 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
17d30 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72   *pCur, BtCursor
17d40 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 69   *pTempCur){.  i
17d50 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
17d60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
17d70 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63  (pCur) );.  memc
17d80 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75  py(pTempCur, pCu
17d90 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73  r, sizeof(BtCurs
17da0 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72  or));.  pTempCur
17db0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
17dc0 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d  TempCur->pPrev =
17dd0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
17de0 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50 61 67  <=pTempCur->iPag
17df0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  e; i++){.    sql
17e00 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
17e10 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  mpCur->apPage[i]
17e20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
17e30 20 20 61 73 73 65 72 74 28 20 70 54 65 6d 70 43    assert( pTempC
17e40 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d  ur->pKey==0 );.}
17e50 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
17e60 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
17e70 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61  r such as was ma
17e80 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65  de by the Create
17e90 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28  TemporaryCursor(
17ea0 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62  ).** function ab
17eb0 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ove..*/.void sql
17ec0 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65  ite3BtreeRelease
17ed0 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
17ee0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
17ef0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63  t i;.  assert( c
17f00 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
17f10 70 43 75 72 29 20 29 3b 0a 20 20 66 6f 72 28 69  pCur) );.  for(i
17f20 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
17f30 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ge; i++){.    sq
17f40 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
17f50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
17f60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
17f70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
17f80 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 0a 0a  ur->pKey);.}....
17f90 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
17fa0 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
17fb0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
17fc0 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
17fd0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
17fe0 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
17ff0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
18000 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
18010 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
18020 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
18030 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
18040 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
18050 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
18060 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
18070 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
18080 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
18090 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
180a0 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
180b0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  o sqlite3BtreePa
180c0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
180d0 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
180e0 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
180f0 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
18100 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
18110 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
18120 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
18130 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
18140 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
18150 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
18160 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
18170 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
18180 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
18190 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
181a0 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
181b0 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
181c0 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
181d0 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
181e0 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
181f0 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
18200 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
18210 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
18220 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
18230 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
18240 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
18250 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
18260 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
18270 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
18280 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
18290 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
182a0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
182b0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
182c0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
182d0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
182e0 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
182f0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
18300 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
18310 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
18320 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
18330 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
18340 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
18350 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
18360 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
18370 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
18380 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
18390 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
183a0 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
183b0 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
183c0 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
183d0 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
183e0 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
183f0 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
18400 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
18410 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
18420 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
18430 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
18440 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
18450 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
18460 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
18470 61 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  age;.      sqlit
18480 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
18490 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
184a0 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
184b0 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
184c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
184d0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
184e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
184f0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
18500 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
18510 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
18520 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
18530 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
18540 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
18550 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
18560 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
18570 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
18580 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
18590 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185c0 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
185d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
185e0 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69           \.    i
18620 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
18630 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >iPage;         
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18660 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
18670 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
18680 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
18690 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
186a0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
186b0 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20  ur->info); \.   
186c0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
186d0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
18710 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18750 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
18760 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
18770 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20  o(pCur);        
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
187b0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d    }.#endif /* _M
187c0 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SC_VER */../*.**
187d0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
187e0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
187f0 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
18800 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
18810 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
18820 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
18830 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
18840 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
18850 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
18860 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
18870 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
18880 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
18890 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
188a0 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
188b0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
188c0 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
188d0 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
188e0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
188f0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
18900 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
18910 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18920 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
18930 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
18940 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
18950 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
18960 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
18970 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
18980 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18990 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
189a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
189b0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
189c0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
189d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
189e0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
189f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
18a00 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a  VALID ){.      *
18a10 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
18a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
18a30 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
18a40 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
18a50 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
18a60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18a70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
18a80 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
18a90 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18aa0 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
18ab0 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
18ac0 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
18ad0 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73  ints to.  Always
18ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18af0 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  K..** Failure is
18b00 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
18b10 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
18b20 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a   not currently.*
18b30 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  * pointing to an
18b40 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61   entry (which ca
18b50 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
18b60 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
18b70 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
18b80 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20  ty) then *pSize 
18b90 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
18ba0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18bb0 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
18bc0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
18bd0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
18be0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
18bf0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
18c00 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
18c10 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
18c20 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
18c30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18c40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18c50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18c60 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
18c70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18c80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
18c90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
18ca0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
18cb0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  {.      /* Not p
18cc0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
18cd0 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
18ce0 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
18cf0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
18d00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18d10 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
18d20 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
18d30 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
18d40 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
18d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18d60 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
18d70 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
18d80 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
18d90 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
18da0 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
18db0 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
18dc0 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
18dd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
18de0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
18df0 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
18e00 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
18e10 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
18e20 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
18e30 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
18e40 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
18e50 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
18e60 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
18e70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
18e80 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
18e90 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
18ea0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
18eb0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
18ec0 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
18ed0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
18ee0 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
18ef0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
18f00 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
18f10 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
18f20 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
18f30 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
18f40 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
18f50 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
18f60 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
18f70 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
18f80 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
18f90 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
18fa0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
18fb0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
18fc0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
18fd0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
18fe0 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
18ff0 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
19000 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
19010 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
19020 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
19030 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
19040 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
19050 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
19060 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
19070 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
19080 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
19090 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
190a0 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
190b0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
190c0 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
190d0 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
190e0 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
190f0 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
19100 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
19110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
19120 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
19130 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
19140 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
19170 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
19180 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
19190 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
191a0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
191b0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
191c0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
191d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
191e0 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
191f0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
19200 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
19210 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
19220 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
19230 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
19240 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19250 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
19260 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
19270 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
19280 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19290 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
192a0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
192b0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
192c0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
192d0 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
192e0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
192f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
19300 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
19310 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
19320 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
19330 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
19340 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
19350 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
19360 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
19370 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
19380 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
19390 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
193a0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
193b0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
193c0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
193d0 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
193e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
193f0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
19400 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
19410 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
19420 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
19430 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
19440 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
19450 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
19460 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
19470 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
19480 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
19490 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67   if( iGuess<=pag
194a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
194b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
194c0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
194d0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
194e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
194f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19500 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
19510 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
19520 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
19530 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
19540 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
19550 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
19560 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
19570 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  dif..  if( rc==S
19580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19590 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
195a0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
195b0 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  fl, &pPage, 0);.
195c0 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53      assert(rc==S
195d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
195e0 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  e==0);.    if( n
195f0 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ext==0 && rc==SQ
19600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19610 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
19620 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
19630 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
19640 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
19650 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
19660 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
19670 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
19680 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19690 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
196a0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
196b0 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
196c0 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
196d0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
196e0 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
196f0 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
19700 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
19710 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
19720 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
19730 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
19740 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
19750 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
19760 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
19770 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
19780 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
19790 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
197a0 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
197b0 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
197c0 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
197d0 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
197e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
197f0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
19800 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
19810 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
19820 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
19830 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
19840 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
19850 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
19860 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
19870 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
19880 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
19890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
198a0 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
198b0 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
198c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
198d0 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
198e0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
198f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19900 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
19910 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
19920 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
19930 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19940 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
19950 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19970 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
19980 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
19990 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
199a0 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
199b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
199c0 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
199d0 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
199e0 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
199f0 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
19a00 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
19a10 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
19a20 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
19a30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
19a40 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
19a50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19a60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19a70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
19a80 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
19a90 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
19aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
19ab0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
19ac0 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
19ad0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
19ae0 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
19af0 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
19b00 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
19b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19b20 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19b30 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
19b40 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
19b50 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
19b60 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
19b70 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
19b80 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
19b90 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
19ba0 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
19bb0 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
19bc0 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
19bd0 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
19be0 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
19bf0 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
19c00 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
19c10 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
19c20 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
19c30 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
19c40 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
19c50 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
19c60 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
19c70 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
19c80 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
19c90 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
19ca0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
19cb0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
19cc0 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e  ot make a distin
19cd0 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65  ction between ke
19ce0 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49  y and data..** I
19cf0 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20  t just reads or 
19d00 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72 6f  writes bytes fro
19d10 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72  m the payload ar
19d20 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20  ea.  Data might 
19d30 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68  .** appear on th
19d40 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62  e main page or b
19d50 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
19d60 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
19d70 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a  flow .** pages..
19d80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
19d90 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
19da0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
19db0 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
19dc0 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
19dd0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
19de0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
19df0 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
19e00 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
19e10 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
19e20 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
19e30 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
19e40 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
19e50 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
19e60 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
19e70 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
19e80 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
19e90 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
19ea0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
19eb0 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
19ec0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
19ed0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
19ee0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
19ef0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
19f00 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
19f10 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
19f20 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
19f30 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
19f40 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
19f50 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
19f60 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
19f70 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
19f80 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
19f90 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
19fa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
19fb0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
19fc0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
19fd0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
19fe0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
19ff0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1a000 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1a010 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1a020 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1a030 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1a040 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1a050 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1a060 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1a070 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1a080 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1a090 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1a0a0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1a0b0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1a0c0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1a0d0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1a0e0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1a0f0 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1a100 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1a110 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1a120 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1a130 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1a140 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1a150 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1a160 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1a170 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1a180 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20   int skipKey,   
1a190 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
1a1a0 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20 69  begins at data i
1a1b0 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
1a1c0 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20  /.  int eOp     
1a1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
1a1e0 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
1a1f0 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
1a200 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1a210 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1a220 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a230 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  OK;.  u32 nKey;.
1a240 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
1a250 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a260 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1a270 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
1a280 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
1a290 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
1a2a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a2b0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a2d0 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
1a2e0 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
1a2f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1a300 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1a310 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a320 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1a330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1a340 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1a350 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1a360 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a370 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a380 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
1a390 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1a3a0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1a3b0 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
1a3c0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
1a3d0 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
1a3e0 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74  ntKey ? 0 : (int
1a3f0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
1a400 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65  );..  if( skipKe
1a410 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  y ){.    offset 
1a420 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  += nKey;.  }.  i
1a430 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20  f( offset+amt > 
1a440 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e  nKey+pCur->info.
1a450 6e 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61 50  nData .   || &aP
1a460 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1a470 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
1a480 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
1a490 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
1a4a0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
1a4b0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
1a4c0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1a4d0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
1a4e0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
1a4f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1a500 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1a510 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
1a520 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
1a530 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
1a540 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
1a550 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
1a560 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
1a570 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
1a580 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
1a590 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
1a5a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1a5b0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
1a5c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
1a5d0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
1a5e0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
1a5f0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
1a600 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1a610 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
1a620 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
1a630 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
1a640 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
1a650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
1a660 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
1a670 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
1a680 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a690 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1a6a0 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
1a6b0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1a6c0 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
1a6d0 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
1a6e0 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
1a6f0 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
1a700 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
1a710 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
1a720 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1a730 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
1a740 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1a750 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
1a760 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
1a770 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1a780 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
1a790 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
1a7a0 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
1a7b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
1a7c0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
1a7d0 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
1a7e0 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
1a7f0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1a800 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1a810 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1a820 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
1a830 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1a840 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1a850 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
1a860 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
1a870 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
1a880 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
1a890 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
1a8a0 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
1a8b0 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
1a8c0 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
1a8d0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
1a8e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a8f0 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
1a900 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
1a910 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1a920 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
1a930 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
1a940 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
1a950 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
1a960 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
1a970 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1a980 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
1a990 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1a9a0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
1a9b0 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  fl);.      if( n
1a9c0 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61  Ovfl && !pCur->a
1a9d0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1a9e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a9f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1aa00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1aa10 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1aa20 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1aa30 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1aa40 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
1aa50 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
1aa60 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
1aa70 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
1aa80 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
1aa90 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
1aaa0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1aab0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1aac0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1aad0 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
1aae0 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  e] ){.      iIdx
1aaf0 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
1ab00 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74  ize);.      next
1ab10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1ab20 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20  erflow[iIdx];.  
1ab30 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
1ab40 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
1ab50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1ab60 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c    for( ; rc==SQL
1ab70 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
1ab80 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64  && nextPage; iId
1ab90 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53  x++){..#ifndef S
1aba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1abb0 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  LOB.      /* If 
1abc0 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
1abd0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1abe0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1abf0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
1ac00 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1ac10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ac20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1ac30 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
1ac40 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
1ac50 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
1ac60 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1ac70 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
1ac80 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Page;.      }.#e
1ac90 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
1aca0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
1acb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1acc0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
1acd0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
1ace0 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
1acf0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1ad00 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
1ad10 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1ad20 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1ad30 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
1ad40 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
1ad50 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
1ad60 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
1ad70 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
1ad80 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
1ad90 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
1ada0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
1adb0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
1adc0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
1add0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
1ade0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e  .        */.#ifn
1adf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ae00 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20  INCRBLOB.       
1ae10 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1ae20 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
1ae30 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
1ae40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
1ae50 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1ae60 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
1ae70 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1ae80 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1ae90 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
1aea0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
1aeb0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
1aec0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  ge);.        off
1aed0 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
1aee0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1aef0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
1af00 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1af10 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
1af20 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
1af30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
1af40 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
1af50 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
1af60 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
1af70 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
1af80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44      */.        D
1af90 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
1afa0 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
1afb0 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  amt;.        rc 
1afc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1afd0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
1afe0 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
1aff0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1b000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b010 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c  .          aPayl
1b020 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
1b030 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
1b040 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  e);.          ne
1b050 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1b060 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
1b070 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
1b080 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
1b090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b0a0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
1b0b0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
1b0c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1b0d0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
1b0e0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
1b0f0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1b100 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
1b110 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1b120 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
1b130 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65  .          offse
1b140 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1b150 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
1b160 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
1b170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b180 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1b190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b1a0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
1b1b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1b1c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1b1d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b1e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
1b1f0 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
1b200 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
1b210 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
1b220 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
1b230 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
1b240 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
1b250 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
1b260 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
1b270 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  set"..**.** Retu
1b280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1b290 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
1b2a0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
1b2b0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1b2c0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
1b2d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
1b2e0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
1b2f0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
1b300 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
1b310 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b320 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
1b330 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
1b340 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
1b350 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
1b360 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1b370 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1b380 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1b390 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1b3a0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1b3b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b3c0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1b3d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1b3e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1b3f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1b400 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
1b410 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1b420 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 69  >iPage] );.    i
1b430 66 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  f( pCur->apPage[
1b440 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
1b450 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b460 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b470 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b480 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1b490 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1b4a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1b4b0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1b4c0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
1b4d0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
1b4e0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
1b4f0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
1b500 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1b510 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b520 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1b530 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
1b540 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1b550 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1b560 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1b570 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1b580 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1b590 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1b5a0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1b5b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1b5c0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1b5d0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1b5e0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1b5f0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1b600 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1b610 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1b620 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1b630 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1b640 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1b650 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b660 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
1b670 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1b680 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1b690 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1b6a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b6b0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1b6c0 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
1b6d0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1b6e0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
1b6f0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
1b700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1b710 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1b720 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1b730 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1b740 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1b750 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1b770 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1b780 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b790 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b7a0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1b7b0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1b7c0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1b7d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b7e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1b7f0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1b800 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1b810 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1b820 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1b830 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1b840 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20  , pBuf, 1, 0);. 
1b850 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b860 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b870 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
1b880 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
1b890 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
1b8a0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
1b8b0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
1b8c0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
1b8d0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
1b8e0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
1b8f0 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
1b900 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
1b910 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
1b920 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
1b930 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
1b940 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
1b950 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
1b960 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
1b970 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
1b980 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
1b990 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1b9a0 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
1b9b0 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
1b9c0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
1b9d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1b9e0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
1b9f0 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
1ba00 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
1ba10 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
1ba20 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
1ba30 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
1ba40 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
1ba50 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
1ba60 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
1ba70 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
1ba80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
1ba90 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
1baa0 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
1bab0 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
1bac0 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
1bad0 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
1bae0 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
1baf0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
1bb00 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
1bb10 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
1bb20 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
1bb30 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
1bb40 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
1bb50 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
1bb60 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1bb70 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
1bb80 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
1bb90 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
1bba0 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
1bbb0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1bbc0 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
1bbd0 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
1bbe0 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
1bbf0 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
1bc00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
1bc10 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1bc20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
1bc30 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
1bc40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1bc50 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1bc60 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
1bc70 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1bc80 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
1bc90 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1bca0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
1bcb0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
1bcc0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
1bcd0 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
1bce0 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
1bcf0 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
1bd00 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
1bd10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
1bd20 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
1bd30 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
1bd40 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63  nKey;.  u32 nLoc
1bd50 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
1bd60 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
1bd70 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
1bd80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1bd90 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
1bda0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1bdb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1bdc0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1bdd0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1bde0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
1bdf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1be00 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
1be10 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1be20 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
1be30 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
1be40 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1be50 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
1be60 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
1be70 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
1be80 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1be90 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
1bea0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
1beb0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
1bec0 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
1bed0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1bee0 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
1bef0 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
1bf00 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
1bf10 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1bf20 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
1bf30 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
1bf40 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1bf50 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
1bf60 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
1bf70 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
1bf80 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
1bf90 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
1bfa0 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
1bfb0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
1bfc0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
1bfd0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
1bfe0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
1bff0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
1c000 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
1c010 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
1c020 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
1c030 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
1c040 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
1c050 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1c060 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
1c070 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
1c080 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
1c090 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
1c0a0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
1c0b0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
1c0c0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
1c0d0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
1c0e0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
1c0f0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
1c100 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
1c110 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
1c120 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
1c130 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
1c140 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
1c150 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
1c160 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1c170 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1c190 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
1c1a0 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
1c1b0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
1c1c0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
1c1d0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
1c1e0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1c1f0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
1c200 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1c210 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
1c220 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c230 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
1c240 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1c250 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1c260 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1c270 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1c280 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
1c290 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
1c2a0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
1c2b0 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
1c2c0 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20  turn 0;.}.const 
1c2d0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
1c2e0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
1c2f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1c300 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1c310 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c320 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1c330 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c340 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1c350 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1c360 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1c370 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1c380 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1c390 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
1c3a0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1c3b0 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1c3c0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1c3d0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1c3e0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1c3f0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1c400 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1c410 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1c420 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
1c430 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1c440 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
1c450 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
1c460 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
1c470 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
1c480 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c490 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
1c4a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1c4b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1c4c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1c4d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c4e0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1c4f0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1c500 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
1c510 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75  PTH );.  if( pCu
1c520 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
1c530 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
1c540 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c550 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c560 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
1c570 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1c580 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
1c590 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  wPage);.  if( rc
1c5a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1c5b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
1c5c0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
1c5d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
1c5e0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
1c5f0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
1c600 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1c610 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1c620 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
1c630 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29  wPage->nCell<1 )
1c640 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1c650 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c660 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1c670 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1c680 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
1c690 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
1c6a0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
1c6b0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
1c6c0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
1c6d0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
1c6e0 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1c6f0 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
1c700 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
1c710 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
1c720 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
1c730 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
1c740 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
1c750 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
1c760 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
1c770 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
1c780 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
1c790 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
1c7a0 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
1c7b0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1c7c0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
1c7d0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
1c7e0 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
1c7f0 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28  hild){.  assert(
1c800 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
1c810 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
1c820 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
1c830 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
1c840 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
1c850 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
1c860 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
1c870 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
1c880 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1c890 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
1c8a0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
1c8b0 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
1c8c0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
1c8d0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
1c8e0 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
1c8f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
1c900 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
1c910 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
1c920 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
1c930 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
1c940 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
1c950 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1c960 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
1c970 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
1c980 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
1c990 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
1c9a0 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
1c9b0 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
1c9c0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
1c9d0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
1c9e0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
1c9f0 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
1ca00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ca10 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
1ca20 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1ca30 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1ca40 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ca50 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1ca60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ca70 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1ca80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1ca90 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
1caa0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1cab0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1cac0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
1cad0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
1cae0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1caf0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
1cb00 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1cb10 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
1cb20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1cb30 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
1cb40 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1cb50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1cb60 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
1cb70 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
1cb80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1cb90 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1cba0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
1cbb0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1cbc0 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  rsor to the root
1cbd0 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20   page.*/.static 
1cbe0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
1cbf0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1cc00 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
1cc10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1cc20 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
1cc30 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
1cc40 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
1cc50 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1cc60 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1cc70 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1cc80 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1cc90 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
1cca0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1ccb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1ccc0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
1ccd0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1cce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1ccf0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
1cd00 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1cd10 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
1cd20 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
1cd30 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
1cd40 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1cd50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
1cd60 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
1cd70 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
1cd80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1cd90 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1cda0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
1cdb0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
1cdc0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1cdd0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
1cde0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1cdf0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1ce00 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1ce10 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  [i]);.    }.  }e
1ce20 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20  lse{.    if( .  
1ce30 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
1ce40 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
1ce50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
1ce60 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
1ce70 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20  apPage[0])).    
1ce80 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
1ce90 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1cea0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
1ceb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1cec0 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   }..  pRoot = pC
1ced0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
1cee0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1cef0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
1cf00 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Root );.  pCur->
1cf10 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75  iPage = 0;.  pCu
1cf20 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
1cf30 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1cf40 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1cf50 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  >atLast = 0;.  p
1cf60 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1cf70 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74   0;..  if( pRoot
1cf80 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
1cf90 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
1cfa0 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
1cfb0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1cfc0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
1cfd0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
1cfe0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
1cff0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
1d000 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
1d010 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
1d020 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1d030 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
1d040 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
1d050 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
1d060 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
1d070 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
1d080 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
1d090 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
1d0a0 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
1d0b0 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
1d0c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
1d0d0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1d0e0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
1d0f0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1d100 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
1d110 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
1d120 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1d130 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
1d140 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1d150 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1d160 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
1d170 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
1d180 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
1d190 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1d1a0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
1d1b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1d1c0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1d1d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d1e0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
1d1f0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1d200 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1d210 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1d220 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1d230 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1d240 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1d250 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1d260 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1d270 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1d280 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
1d290 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1d2a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1d2b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1d2c0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
1d2d0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1d2e0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
1d2f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
1d300 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1d310 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1d320 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d330 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1d340 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1d350 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
1d360 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
1d370 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
1d380 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
1d390 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1d3a0 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
1d3b0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
1d3c0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
1d3d0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
1d3e0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
1d3f0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1d400 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
1d410 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
1d420 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
1d430 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
1d440 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
1d450 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
1d460 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1d470 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
1d480 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
1d490 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
1d4a0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
1d4b0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
1d4c0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
1d4d0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1d4e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1d4f0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
1d500 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1d510 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1d520 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d530 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1d540 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
1d550 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d560 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1d570 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1d580 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d590 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
1d5a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1d5b0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
1d5c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1d5d0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
1d5e0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1d5f0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1d600 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1d610 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
1d620 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1d630 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
1d640 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1d650 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1d660 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
1d670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d680 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1d690 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
1d6a0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
1d6b0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1d6c0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1d6d0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1d6e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d6f0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1d700 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
1d710 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
1d720 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1d730 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1d740 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1d750 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1d760 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1d770 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1d780 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1d790 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1d7a0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1d7b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d7c0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
1d7d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1d7e0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1d7f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d800 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d810 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1d820 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d830 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1d840 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1d850 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1d860 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1d870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d880 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1d890 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1d8a0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
1d8b0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1d8c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1d8d0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1d8e0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1d8f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d900 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d910 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1d920 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1d930 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
1d940 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1d950 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1d960 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1d970 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1d980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1d990 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1d9a0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1d9b0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1d9c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1d9d0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1d9e0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1d9f0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1da00 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1da10 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1da20 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1da30 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1da40 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1da50 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1da60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1da70 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1da80 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
1da90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1daa0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1dab0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1dac0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1dad0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1dae0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
1daf0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1db00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1db10 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
1db20 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1db30 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1db40 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1db50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1db60 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
1db70 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1db80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1db90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1dba0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1dbb0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
1dbc0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1dbd0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1dbe0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1dbf0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
1dc00 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72  Cur);.      pCur
1dc10 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53  ->atLast = rc==S
1dc20 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20  QLITE_OK ?1:0;. 
1dc30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1dc40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1dc50 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
1dc60 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1dc70 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
1dc80 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
1dc90 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
1dca0 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
1dcb0 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
1dcc0 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
1dcd0 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
1dce0 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
1dcf0 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
1dd00 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
1dd10 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
1dd20 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
1dd30 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
1dd40 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
1dd50 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
1dd60 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
1dd70 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
1dd80 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
1dd90 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
1dda0 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
1ddb0 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
1ddc0 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
1ddd0 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
1dde0 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
1ddf0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1de00 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
1de10 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
1de20 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
1de30 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
1de40 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1de50 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
1de60 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
1de70 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
1de80 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
1de90 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
1dea0 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
1deb0 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
1dec0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
1ded0 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
1dee0 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
1def0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1df00 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
1df10 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1df20 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1df30 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1df60 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
1df70 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
1df80 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
1df90 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
1dfa0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
1dfb0 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
1dfc0 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
1dfd0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
1dfe0 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
1dff0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1e000 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1e010 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1e020 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
1e030 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
1e040 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
1e050 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
1e060 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1e070 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1e080 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1e0a0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
1e0b0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
1e0c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e0d0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1e0e0 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
1e0f0 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
1e100 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1e110 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
1e120 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
1e130 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
1e140 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
1e150 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
1e160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e170 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
1e180 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
1e190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1e1a0 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
1e1b0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
1e1c0 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
1e1d0 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
1e1e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
1e1f0 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
1e200 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1e210 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1e220 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e230 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e240 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1e250 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1e260 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
1e270 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1e280 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
1e290 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
1e2a0 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
1e2b0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
1e2c0 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
1e2d0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1e2e0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
1e2f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1e300 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e310 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
1e320 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
1e330 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
1e340 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
1e350 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1e360 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
1e370 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1e380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e390 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
1e3a0 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
1e3b0 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
1e3c0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
1e3d0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
1e3e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e3f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1e400 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
1e410 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1e420 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1e430 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1e440 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1e450 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1e460 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1e470 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1e480 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
1e490 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1e4a0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1e4b0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
1e4c0 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
1e4d0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1e4e0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1e4f0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1e500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e510 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1e520 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
1e530 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
1e540 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
1e550 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
1e560 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
1e570 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1e580 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1e590 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1e5a0 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b  .    int c = -1;
1e5b0 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e    /* pRes return
1e5c0 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70   if table is emp
1e5d0 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f  ty must be -1 */
1e5e0 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
1e5f0 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
1e600 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
1e610 28 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  (!pPage->intKey 
1e620 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c  && pIdxKey==0) |
1e630 7c 20 75 70 72 3c 30 20 29 7b 0a 20 20 20 20 20  | upr<0 ){.     
1e640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1e650 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1e660 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1e670 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ish;.    }.    i
1e680 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
1e690 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1e6a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1e6b0 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d   (u16)upr;.    }
1e6c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
1e6d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1e6e0 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70  age] = (u16)((up
1e6f0 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+lwr)/2);.    }
1e700 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
1e710 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
1e720 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43  ey;.      i64 nC
1e730 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  ellKey;.      in
1e740 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
1e750 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e760 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1e770 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1e780 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1e790 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Key = 1;.      i
1e7a0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1e7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
1e7c0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pCell;.        p
1e7d0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1e7e0 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
1e7f0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
1e800 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1e810 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
1e820 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
1e830 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
1e840 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
1e850 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
1e860 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
1e870 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
1e880 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
1e890 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1e8a0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69   if( nCellKey==i
1e8b0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1e8c0 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
1e8d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
1e8e0 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
1e8f0 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
1e900 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e910 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1e920 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
1e930 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
1e940 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1e950 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e960 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61        int availa
1e970 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ble;.        pCe
1e980 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29  llKey = (void *)
1e990 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1e9a0 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30  r, &available, 0
1e9b0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
1e9c0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
1e9d0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  .nKey;.        i
1e9e0 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43  f( available>=nC
1e9f0 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ellKey ){.      
1ea00 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1ea10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ea20 28 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20  ((int)nCellKey, 
1ea30 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
1ea40 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
1ea50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  e{.          pCe
1ea60 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
1ea70 61 6c 6c 6f 63 28 20 28 69 6e 74 29 6e 43 65 6c  alloc( (int)nCel
1ea80 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  lKey );.        
1ea90 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
1eaa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1eab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1eac0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
1ead0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1eae0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
1eaf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1eb00 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1eb10 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
1eb20 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 2a 29 70 43  llKey, (void*)pC
1eb30 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1eb40 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
1eb50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1eb60 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70  (int)nCellKey, p
1eb70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
1eb80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1eb90 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
1eba0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
1ebb0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
1ebc0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1ebd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ebe0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
1ebf0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1ec00 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1ec10 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
1ec20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1ec30 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1ec40 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
1ec50 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
1ec60 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
1ec70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1ec80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ec90 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
1eca0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
1ecb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ecc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
1ecd0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1ece0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ecf0 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
1ed00 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
1ed10 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1ed20 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69  .        upr = i
1ed30 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
1ed40 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
1ed50 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
1ed60 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
1ed70 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62  llKey;.        b
1ed80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1ed90 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1eda0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1edb0 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32  u16)((lwr+upr)/2
1edc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1edd0 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
1ede0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1edf0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1ee00 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1ee10 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
1ee20 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
1ee30 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
1ee40 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1ee50 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1ee60 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1ee70 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1ee80 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
1ee90 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
1eea0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1eeb0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
1eec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1eed0 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
1eee0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1eef0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ef00 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1ef10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1ef20 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1ef30 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1ef40 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
1ef50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1ef60 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1ef70 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
1ef80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1ef90 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
1efa0 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
1efb0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1efc0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1efd0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
1efe0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1eff0 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
1f000 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
1f010 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
1f020 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
1f030 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f040 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
1f050 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
1f060 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
1f070 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
1f080 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
1f090 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
1f0a0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1f0b0 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
1f0c0 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
1f0d0 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
1f0e0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
1f0f0 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
1f100 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f110 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
1f120 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1f130 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
1f140 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
1f150 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
1f160 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1f170 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
1f180 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
1f190 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
1f1a0 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
1f1b0 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
1f1c0 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
1f1d0 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
1f1e0 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
1f1f0 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
1f200 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
1f210 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
1f220 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1f230 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
1f240 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
1f250 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
1f260 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f280 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
1f290 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1f2a0 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
1f2b0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1f2c0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1f2d0 63 6f 72 64 20 61 53 70 61 63 65 5b 31 36 5d 3b  cord aSpace[16];
1f2e0 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
1f2f0 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
1f300 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
1f310 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
1f320 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
1f330 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
1f340 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
1f350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1f360 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
1f370 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
1f380 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20  nKey, pKey,.    
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66    aSpace, sizeof
1f3c0 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69  (aSpace));.    i
1f3d0 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
1f3e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f3f0 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
1f400 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
1f410 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1f420 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
1f430 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
1f440 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
1f450 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65  pRes);.  if( pKe
1f460 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1f470 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
1f480 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79  edRecord(pIdxKey
1f490 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f4a0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1f4b0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1f4c0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1f4d0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1f4e0 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
1f4f0 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
1f500 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
1f510 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
1f520 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
1f530 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
1f540 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1f550 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
1f560 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
1f570 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
1f580 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
1f590 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
1f5a0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
1f5b0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1f5c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f5d0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
1f5e0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
1f5f0 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
1f600 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
1f610 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
1f620 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
1f630 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
1f640 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
1f650 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
1f660 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
1f670 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
1f680 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
1f690 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
1f6a0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
1f6b0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
1f6c0 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
1f6d0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ate);.}../*.** R
1f6e0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
1f6f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
1f700 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73 6f  ndle for a curso
1f710 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  r..*/.sqlite3 *s
1f720 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1f730 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72 73  rDb(const BtCurs
1f740 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
1f750 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1f760 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1f770 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1f780 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75   );.  return pCu
1f790 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d  r->pBtree->db;.}
1f7a0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
1f7b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1f7c0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
1f7d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1f7e0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1f7f0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1f800 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1f810 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1f820 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1f830 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1f840 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1f850 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1f860 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
1f870 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
1f880 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f890 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
1f8a0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1f8b0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1f8c0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
1f8d0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1f8e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f8f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f900 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1f910 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1f920 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1f930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1f940 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1f950 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
1f960 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  );.  if( CURSOR_
1f970 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1f980 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
1f990 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1f9a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f9b0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
1f9c0 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip>0 ){.    pCur
1f9d0 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
1f9e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
1f9f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fa00 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
1fa10 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
1fa20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1fa30 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
1fa40 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
1fa50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
1fa60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fa70 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
1fa80 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65  sert( idx<=pPage
1fa90 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43  ->nCell );..  pC
1faa0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1fab0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1fac0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
1fad0 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
1fae0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
1faf0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1fb00 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1fb10 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
1fb20 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1fb30 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1fb40 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
1fb50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1fb60 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
1fb70 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1fb80 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
1fb90 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1fba0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1fbb0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
1fbc0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
1fbd0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
1fbe0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
1fbf0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1fc00 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
1fc10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fc20 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1fc30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
1fc40 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1fc50 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1fc60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fc70 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
1fc80 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
1fc90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
1fca0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
1fcb0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1fcc0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1fcd0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
1fce0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1fcf0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
1fd00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fd10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1fd20 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
1fd30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
1fd40 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
1fd50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1fd60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd70 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
1fd80 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1fd90 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
1fda0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
1fdb0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1fdc0 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
1fdd0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
1fde0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1fdf0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
1fe00 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1fe10 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
1fe20 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
1fe30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1fe40 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1fe50 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
1fe60 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
1fe70 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
1fe80 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
1fe90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fea0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
1feb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1fec0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1fed0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
1fee0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1fef0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ff00 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1ff10 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1ff20 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1ff30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ff40 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1ff50 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
1ff60 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
1ff70 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1ff80 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1ff90 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1ffa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1ffb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1ffc0 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29  ( pCur->skip<0 )
1ffd0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1ffe0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1fff0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
20000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
20010 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
20020 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
20030 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20040 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
20050 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
20060 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
20070 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
20080 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
20090 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
200a0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
200b0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
200c0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
200d0 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
200e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
200f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20100 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
20110 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
20120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
20130 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
20140 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
20150 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
20160 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
20170 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
20180 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
20190 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
201a0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
201b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
201c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
201d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
201e0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
201f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
20200 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
20210 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
20220 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
20230 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20240 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
20250 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
20260 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20270 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
20280 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
20290 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
202a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
202b0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
202c0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
202d0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
202e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
202f0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
20300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20310 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
20320 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
20330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20340 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
20350 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
20360 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
20370 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
20380 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
20390 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
203a0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
203b0 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
203c0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
203d0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
203e0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
203f0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
20400 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
20410 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
20420 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
20430 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
20440 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
20450 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
20460 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
20470 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
20480 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
20490 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
204a0 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
204b0 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
204c0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
204d0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
204e0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
204f0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
20500 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
20510 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
20520 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
20530 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
20540 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
20550 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
20560 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
20570 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
20580 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
20590 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
205a0 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
205b0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
205c0 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
205d0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
205e0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
205f0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
20600 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20610 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
20620 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
20630 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
20640 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
20650 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
20660 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
20670 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
20680 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
20690 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
206a0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
206b0 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
206c0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
206d0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
206e0 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
206f0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
20700 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
20710 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
20720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
20730 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
20740 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
20750 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
20760 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
20770 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
20780 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
20790 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
207a0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
207b0 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a  .  int n;     /*
207c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
207d0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
207e0 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20   */.  int k;    
207f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
20800 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
20810 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
20820 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
20830 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
20840 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
20850 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  k = 0;..  assert
20860 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20870 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
20880 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
20890 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20  Bt->pPage1;.  n 
208a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
208b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
208c0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
208d0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
208e0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
208f0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
20900 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
20910 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
20920 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
20930 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
20940 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
20950 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
20960 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
20970 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
20980 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
20990 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
209a0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
209b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
209c0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
209d0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
209e0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
209f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
20a00 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
20a10 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
20a20 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
20a30 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
20a40 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
20a50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
20a60 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
20a70 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65 72  && nearby<=pager
20a80 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
20a90 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
20aa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20ab0 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
20ac0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
20ad0 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
20ae0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
20af0 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
20b00 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
20b10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
20b20 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
20b30 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
20b40 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
20b50 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
20b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
20b70 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
20b80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20b90 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
20ba0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
20bb0 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
20bc0 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
20bd0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
20be0 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
20bf0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
20c00 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
20c10 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
20c20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20c30 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
20c40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
20c50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
20c60 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
20c70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
20c80 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
20c90 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
20ca0 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
20cb0 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
20cc0 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
20cd0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
20ce0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
20cf0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
20d00 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
20d10 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
20d20 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
20d30 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
20d40 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
20d50 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
20d60 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
20d70 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
20d80 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
20d90 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
20da0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
20db0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
20dc0 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
20dd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
20de0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
20df0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
20e00 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
20e10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20e20 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
20e30 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
20e40 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  k, 0);.      if(
20e50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
20e60 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
20e70 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
20e80 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
20e90 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
20ea0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
20eb0 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
20ec0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
20ed0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
20ee0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
20ef0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
20f00 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
20f10 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
20f20 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
20f30 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
20f40 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
20f50 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
20f60 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
20f70 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
20f80 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
20f90 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
20fa0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
20fb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20fc0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
20fd0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
20fe0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
20ff0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
21000 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
21010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
21020 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
21030 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
21040 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
21050 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
21060 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
21070 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
21080 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
21090 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
210a0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
210b0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
210c0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
210d0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
210e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
210f0 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ( k>pBt->usableS
21100 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
21110 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
21120 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
21130 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
21140 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
21150 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21160 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21170 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
21180 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
21190 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
211a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
211b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
211c0 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
211d0 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
211e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
211f0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
21200 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
21210 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
21220 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
21230 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
21240 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
21250 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
21260 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21270 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
21280 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
21290 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
212a0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
212b0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
212c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
212d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
212e0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
212f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
21300 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
21310 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
21320 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
21330 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
21340 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
21350 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
21360 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
21370 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
21380 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
21390 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
213a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
213b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
213c0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
213d0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
213e0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
213f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21400 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21410 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
21420 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
21430 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
21440 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
21450 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
21460 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
21470 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
21480 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
21490 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
214a0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
214b0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
214c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
214d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
214e0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
214f0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
21500 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
21510 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
21520 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21530 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
21540 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
21550 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
21560 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21580 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
21590 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
215a0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
215b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
215c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
215d0 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
215e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
215f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21600 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
21610 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
21620 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
21630 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
21640 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
21650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21660 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
21670 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
21680 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
21690 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
216a0 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
216b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
216c0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
216d0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
216e0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
216f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
21700 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
21710 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21720 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
21730 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
21740 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
21750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
21760 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
21770 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
21780 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
21790 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
217a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
217b0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
217c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
217d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
217e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
217f0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
21800 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21810 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
21830 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
21840 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
21850 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
21860 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
21870 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
21880 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
21890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
218a0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
218b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
218c0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
218d0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
218e0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
218f0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
21900 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
21910 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
21920 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
21930 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
21940 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73          int clos
21950 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
21960 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
21970 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21980 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
21990 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72  aData;.        r
219a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
219b0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
219c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
219d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
219e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
219f0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
21a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21a10 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
21a20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64          int i, d
21a30 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
21a40 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
21a50 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
21a60 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
21a70 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
21a80 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
21a90 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
21aa0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
21ab0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
21ac0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
21ad0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
21ae0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
21af0 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
21b00 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
21b10 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
21b20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
21b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
21b40 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
21b50 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
21b60 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
21b70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21b80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21b90 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
21ba0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
21bb0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
21bc0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
21bd0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
21be0 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
21bf0 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
21c00 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
21c10 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
21c20 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nt;.          Pg
21c30 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20  no nPage;.      
21c40 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
21c50 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50  ge;.          nP
21c60 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
21c70 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 20  ount(pBt);.     
21c80 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e       if( *pPgno>
21c90 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
21ca0 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
21cb0 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
21cc0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
21cd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21ce0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21cf0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
21d00 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
21d10 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
21d20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
21d30 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
21d40 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
21d50 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
21d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21d70 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
21d80 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
21da0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
21db0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
21dc0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
21dd0 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
21de0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
21df0 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
21e00 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
21e10 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
21e20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21e30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
21e40 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
21e50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21e60 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
21e70 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b  writeable(pTrunk
21e80 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
21e90 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
21ea0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
21eb0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
21ec0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
21ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21ee0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
21ef0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
21f00 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
21f10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21f20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21f30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21f40 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
21f50 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
21f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
21f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21f80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21f90 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
21fa0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
21fb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
21fc0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
21fd0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
21fe0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21ff0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
22000 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
22010 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
22020 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
22030 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
22040 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
22050 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
22060 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
22070 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
22080 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
22090 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
220a0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  e */.    int nPa
220b0 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
220c0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  unt(pBt);.    *p
220d0 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31  Pgno = nPage + 1
220e0 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e  ;..    if( *pPgn
220f0 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
22100 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
22110 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
22120 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
22130 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22140 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
22150 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
22160 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
22170 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
22180 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
22190 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
221a0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
221b0 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
221c0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
221d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
221e0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
221f0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
22200 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
22210 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
22220 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
22230 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
22240 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
22250 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
22260 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
22270 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
22280 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
22290 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
222a0 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  )\n", *pPgno));.
222b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
222c0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
222d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
222e0 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
222f0 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
22300 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
22310 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a  _PAGE(pBt) ){ (*
22320 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20  pPgno)++; }.    
22330 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  }.#endif..    as
22340 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
22350 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
22360 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
22370 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
22380 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
22390 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
223a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
223b0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
223c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
223d0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
223e0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
223f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22400 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22410 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
22420 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
22430 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
22440 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
22450 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
22460 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
22470 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
22480 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
22490 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
224a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
224b0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
224c0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
224d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
224e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
224f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
22500 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
22510 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
22520 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
22530 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
22540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22550 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22560 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
22570 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
22580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
225a0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
225b0 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
225c0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
225d0 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
225e0 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
225f0 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
22600 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
22610 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
22620 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
22630 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
22640 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
22650 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
22660 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
22670 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
22680 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
22690 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
226a0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
226b0 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
226c0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
226d0 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
226e0 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
226f0 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
22700 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
22710 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
22720 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
22730 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
22740 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
22750 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
22760 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
22770 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
22780 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
22790 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
227a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
227b0 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
227c0 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
227d0 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
227e0 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
227f0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
22800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22810 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
22820 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
22830 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22850 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
22860 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
22870 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
22880 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
22890 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
228a0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
228b0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
228c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
228d0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
228e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
228f0 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
22900 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
22910 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
22940 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
22950 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22970 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
22980 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
22990 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
229a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
229b0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
229c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50   );.  assert( iP
229d0 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
229e0 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
229f0 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
22a00 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
22a10 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
22a20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
22a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
22a40 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
22a50 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
22a60 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
22a70 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
22a80 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
22a90 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
22aa0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
22ab0 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
22ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22ad0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
22ae0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
22af0 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
22b00 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
22b10 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
22b20 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
22b30 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
22b40 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
22b50 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20  ree+1);..#ifdef 
22b60 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
22b70 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65  LETE.  /* If the
22b80 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
22b90 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69  ELETE compile-ti
22ba0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  me option is ena
22bb0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  bled, then.  ** 
22bc0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
22bd0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
22be0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
22bf0 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  zeros..  */.  if
22c00 28 20 28 21 70 50 61 67 65 20 26 26 20 28 72 63  ( (!pPage && (rc
22c10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
22c20 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
22c30 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a  e, &pPage, 0))).
22c40 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
22c50 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
22c60 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
22c70 70 44 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20  pDbPage)).  ){. 
22c80 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
22c90 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  _out;.  }.  mems
22ca0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
22cb0 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
22cc0 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69  pageSize);.#endi
22cd0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  f..  /* If the d
22ce0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
22cf0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
22d00 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
22d10 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
22d20 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
22d30 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
22d40 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
22d50 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
22d60 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ){.    rc = ptrm
22d70 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
22d80 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
22d90 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
22da0 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
22db0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
22dc0 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
22dd0 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
22de0 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
22df0 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
22e00 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
22e10 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
22e20 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
22e30 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
22e40 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
22e50 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
22e60 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
22e70 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
22e80 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
22e90 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
22ea0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
22eb0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
22ec0 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
22ed0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
22ee0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
22ef0 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
22f00 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
22f10 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
22f20 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
22f30 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
22f40 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
22f50 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
22f60 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
22f70 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c  =0 ){.    int nL
22f80 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
22f90 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
22fa0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
22fb0 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
22fc0 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
22fd0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
22fe0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
22ff0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
23000 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
23010 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
23020 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
23030 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23040 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
23050 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
23060 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
23070 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
23080 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66  Data[4]);.    if
23090 28 20 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20  ( nLeaf<0 ){.   
230a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
230b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
230c0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
230d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
230e0 69 66 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75  if( nLeaf<pBt->u
230f0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
23100 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
23110 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
23120 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
23130 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
23140 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
23150 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
23160 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
23170 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
23180 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
23190 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
231a0 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
231b0 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
231c0 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
231d0 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
231e0 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
231f0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
23200 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
23210 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
23220 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
23230 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
23240 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
23250 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
23260 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
23270 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
23280 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
23290 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
232a0 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
232b0 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
232c0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
232d0 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
232e0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
232f0 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
23300 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
23310 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
23320 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
23330 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
23340 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74   contain to rest
23350 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
23360 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
23370 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
23380 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
23390 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
233a0 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
233b0 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
233c0 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
233d0 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
233e0 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
233f0 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
23400 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
23410 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
23420 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
23430 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
23440 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
23450 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -8"..      */.  
23460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23470 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
23480 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
23490 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
234a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
234b0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
234c0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
234d0 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
234e0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
234f0 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
23500 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65  , iPage);.#ifnde
23510 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
23520 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 69  DELETE.        i
23530 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
23540 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
23550 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
23560 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
23570 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
23580 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
23590 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
235a0 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
235b0 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
235c0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
235d0 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
235e0 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
235f0 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
23600 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
23610 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
23620 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
23630 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
23640 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
23650 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
23660 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
23670 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
23680 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
23690 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
236a0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
236b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
236c0 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
236d0 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
236e0 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
236f0 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
23700 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
23710 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
23720 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
23730 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
23740 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
23750 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
23760 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
23770 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
23780 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
23790 2a 2f 0a 20 20 69 66 28 20 20 20 28 28 21 70 50  */.  if(   ((!pP
237a0 61 67 65 29 20 26 26 20 28 30 20 21 3d 20 28 72  age) && (0 != (r
237b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
237c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
237d0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29  ge, &pPage, 0)))
237e0 29 0a 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20  ).     || (0 != 
237f0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
23800 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
23810 44 62 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20  DbPage))).  ){. 
23820 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
23830 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
23840 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
23850 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
23860 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
23870 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
23880 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
23890 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
238a0 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
238b0 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
238c0 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
238d0 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
238e0 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
238f0 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
23900 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
23910 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
23920 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
23930 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
23940 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
23950 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
23960 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69  n rc;.}.static i
23970 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  nt freePage(MemP
23980 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  age *pPage){.  r
23990 65 74 75 72 6e 20 66 72 65 65 50 61 67 65 32 28  eturn freePage2(
239a0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
239b0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
239c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
239d0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
239e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
239f0 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
23a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23a10 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
23a20 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
23a30 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
23a40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23a50 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
23a60 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
23a70 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
23a80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
23a90 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76   nOvfl;.  u16 ov
23aa0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
23ab0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
23ac0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
23ad0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
23ae0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
23af0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
23b00 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
23b10 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
23b20 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  rflow==0 ){.    
23b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b40 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
23b50 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
23b60 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
23b70 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
23b80 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
23b90 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
23ba0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
23bb0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
23bc0 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
23bd0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
23be0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
23bf0 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
23c00 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
23c10 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
23c20 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
23c30 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
23c40 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
23c50 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
23c60 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
23c70 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
23c80 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
23c90 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
23ca0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
23cb0 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  o==0 || ovflPgno
23cc0 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
23cd0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  pBt) ){.      re
23ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23cf0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
23d00 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
23d10 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
23d20 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
23d30 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
23d40 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
23d50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
23d60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
23d70 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
23d80 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
23d90 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  gno);.    if( pO
23da0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
23db0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
23dc0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
23dd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23de0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23df0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
23e00 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
23e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23e20 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
23e30 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
23e40 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
23e50 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
23e60 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
23e70 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
23e80 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
23e90 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
23ea0 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
23eb0 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
23ec0 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
23ed0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
23ee0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
23ef0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
23f00 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
23f10 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
23f20 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
23f30 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
23f40 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
23f50 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
23f60 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
23f70 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
23f80 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
23f90 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
23fa0 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
23fb0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
23fc0 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
23fd0 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
23fe0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
23ff0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
24000 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
24010 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
24020 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
24030 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
24040 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
24050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24060 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
24070 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
24080 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
24090 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
240a0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
240b0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
240c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
240d0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
240e0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
240f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
24100 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
24110 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
24120 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
24150 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
24160 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
24170 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
24180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
24190 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
241a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
241b0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
241c0 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
241d0 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
241e0 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
241f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
24200 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
24210 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
24220 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
24230 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
24240 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
24250 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
24260 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
24270 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
24280 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
24290 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
242a0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
242b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
242c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
242d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
242e0 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
242f0 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
24300 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
24310 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
24320 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
24330 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
24340 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
24350 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
24360 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
24370 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
24380 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
24390 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
243a0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
243b0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
243c0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
243d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
243e0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
243f0 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
24400 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
24410 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
24420 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
24430 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
24440 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
24450 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
24460 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
24470 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
24480 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
24490 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
244a0 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
244b0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
244c0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
244d0 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
244e0 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Key);.  sqlite3B
244f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
24500 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
24510 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
24520 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
24530 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
24540 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
24550 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
24560 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33   info.nData==(u3
24570 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20  2)(nData+nZero) 
24580 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
24590 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
245a0 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
245b0 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
245c0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
245d0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
245e0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
245f0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
24600 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
24610 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3e 30   .    if( nKey>0
24620 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
24630 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  y==0 ){.      re
24640 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24650 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  UPT;.    }.    n
24660 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
24670 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
24680 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
24690 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
246a0 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
246b0 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
246c0 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
246d0 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
246e0 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
246f0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
24700 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
24710 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
24720 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
24730 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
24740 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
24750 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24760 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
24770 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
24780 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
24790 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
247a0 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
247b0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
247c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
247d0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
247e0 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
247f0 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
24800 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
24810 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
24820 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
24830 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
24840 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
24850 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
24860 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
24870 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
24880 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
24890 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
248a0 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
248b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
248c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
248d0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
248e0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
248f0 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
24900 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
24910 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
24920 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
24930 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
24940 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
24950 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
24960 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
24970 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
24980 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
24990 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
249a0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
249b0 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
249c0 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
249d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
249e0 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
249f0 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
24a00 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
24a10 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
24a20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
24a30 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
24a40 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
24a50 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
24a60 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
24a70 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
24a80 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c  ninitialised val
24a90 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
24aa0 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
24ab0 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
24ac0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
24ad0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
24ae0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
24af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24b00 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
24b10 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
24b20 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
24b30 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
24b40 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  W1);.        rc 
24b50 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
24b60 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
24b70 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20  , pgnoPtrmap);. 
24b80 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
24b90 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
24ba0 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
24bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24bc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
24bd0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
24be0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
24bf0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
24c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24c10 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
24c20 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
24c30 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
24c40 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
24c50 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
24c60 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
24c70 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
24c80 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
24c90 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
24ca0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
24cb0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
24cc0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
24cd0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
24ce0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
24cf0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
24d00 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
24d10 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
24d20 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
24d30 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
24d40 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
24d50 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
24d60 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
24d70 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
24d80 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
24d90 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
24da0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
24db0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
24dc0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
24dd0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
24de0 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
24df0 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
24e00 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
24e10 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
24e20 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
24e30 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
24e40 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
24e50 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
24e60 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
24e70 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
24e80 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
24e90 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
24ea0 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
24eb0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
24ec0 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
24ed0 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
24ee0 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
24ef0 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
24f00 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
24f10 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
24f20 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
24f30 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
24f40 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
24f50 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
24f60 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
24f70 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
24f80 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
24f90 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
24fa0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
24fb0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
24fc0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
24fd0 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
24fe0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
24ff0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
25000 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
25010 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
25020 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
25030 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
25040 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
25050 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
25060 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
25070 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
25080 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
25090 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
250a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
250b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
250c0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
250d0 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
250e0 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
250f0 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
25100 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
25110 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
25120 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
25130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
25140 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
25150 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
25160 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
25170 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
25180 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
25190 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
251a0 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
251b0 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
251c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
251d0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
251e0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
251f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
25200 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
25210 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
25220 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25230 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
25240 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
25250 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
25260 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
25270 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
25280 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
25290 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
252a0 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
252b0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
252c0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
252d0 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
252e0 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
252f0 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
25300 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
25310 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
25320 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
25330 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
25340 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
25350 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
25360 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
25370 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  t dropCell(MemPa
25380 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
25390 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  dx, int sz){.  i
253a0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
253b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
253c0 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
253d0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
253e0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
253f0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
25400 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
25410 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
25420 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
25430 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
25440 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
25450 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
25460 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
25470 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
25480 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
25490 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
254a0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
254b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
254c0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
254d0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
254e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
254f0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25500 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
25510 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
25520 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25530 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
25540 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
25550 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
25560 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
25570 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
25580 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
25590 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
255a0 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61 67  ;.  if( (pc<pPag
255b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
255c0 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
255d0 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73 7a  ).     || (pc+sz
255e0 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
255f0 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  bleSize) ){.    
25600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25610 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25620 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
25630 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
25640 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
25660 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f 72  rn rc;.  }.  for
25670 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
25680 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
25690 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
256a0 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
256b0 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
256c0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
256d0 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
256e0 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
256f0 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
25700 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
25710 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
25720 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25730 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
25740 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
25750 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
25760 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
25770 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
25780 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
25790 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
257a0 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
257b0 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
257c0 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
257d0 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
257e0 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
257f0 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
25800 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
25810 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
25820 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
25830 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
25840 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
25850 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
25860 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
25870 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e  Page->aOvfl[] an
25880 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
25890 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
258a0 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
258b0 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
258c0 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
258d0 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
258e0 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
258f0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
25900 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
25910 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
25920 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
25930 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
25940 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  emented..**.** I
25950 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  f nSkip is non-z
25960 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ero, then do not
25970 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20   copy the first 
25980 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
25990 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  he.** cell. The 
259a0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72  caller will over
259b0 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72  write them after
259c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
259d0 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53  eturns. If.** nS
259e0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
259f0 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20   then pCell may 
25a00 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  not point to an 
25a10 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c  invalid memory l
25a20 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74  ocation .** (but
25a30 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20   pCell+nSkip is 
25a40 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a  always valid)..*
25a50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
25a60 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
25a70 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
25a80 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
25a90 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
25aa0 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
25ab0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
25ac0 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
25ad0 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
25ae0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
25af0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
25b00 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
25b10 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
25b20 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
25b30 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
25b40 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
25b50 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
25b60 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
25b70 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
25b80 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
25b90 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20   u8 nSkip       
25ba0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69     /* Do not wri
25bb0 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  te the first nSk
25bc0 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ip bytes of the 
25bd0 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  cell */.){.  int
25be0 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f   idx;          /
25bf0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
25c00 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
25c10 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
25c20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
25c30 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
25c40 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  er */.  int top;
25c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
25c60 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65  st byte of conte
25c70 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20  nt for any cell 
25c80 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
25c90 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
25ca0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
25cb0 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
25cc0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
25cd0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
25ce0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
25cf0 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
25d00 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
25d10 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
25d20 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
25d30 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
25d40 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66  t into data[] of
25d50 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
25d60 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
25d70 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
25d80 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
25d90 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
25da0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
25db0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
25dc0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
25dd0 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
25de0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
25df0 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f    /* Used for mo
25e00 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ving information
25e10 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b   around in data[
25e20 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
25e30 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
25e40 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
25e50 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
25e60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
25e70 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
25e80 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
25e90 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
25ea0 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
25eb0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
25ec0 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
25ed0 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20  age->aOvfl) );. 
25ee0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
25ef0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
25f00 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  pCell) );.  asse
25f10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25f20 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
25f30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
25f40 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
25f50 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
25f60 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
25f70 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
25f80 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
25f90 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
25fa0 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
25fb0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
25fc0 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  mp;.    }.    j 
25fd0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
25fe0 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
25ff0 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
26000 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
26010 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
26020 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
26030 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
26040 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
26050 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
26060 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a  ].idx = (u16)i;.
26070 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
26080 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
26090 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
260a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
260b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
260c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
260d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
260e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
260f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26100 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26110 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
26120 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
26130 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
26140 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
26150 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74  hdrOffset;.    t
26160 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
26170 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
26180 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
26190 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
261a0 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
261b0 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
261c0 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20  >nCell + 2;.    
261d0 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
261e0 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20   + 2*i;.    if( 
261f0 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29  end > top - sz )
26200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65 66  {.      rc = def
26210 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
26220 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
26230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26240 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
26250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26260 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
26270 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
26280 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
26290 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  + sz <= top );. 
262a0 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61     }.    idx = a
262b0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
262c0 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73  ge, sz);.    ass
262d0 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20  ert( idx>0 );.  
262e0 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d    assert( end <=
262f0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
26300 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69  hdr+5]) );.    i
26310 66 20 28 69 64 78 2b 73 7a 20 3e 20 70 50 61 67  f (idx+sz > pPag
26320 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
26330 7a 65 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ze) {.      retu
26340 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
26350 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
26360 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
26370 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
26380 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d  ee -= 2;.    mem
26390 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
263a0 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
263b0 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
263c0 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70    for(j=end-2, p
263d0 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
263e0 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
263f0 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
26400 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
26410 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
26420 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
26430 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
26440 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
26450 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
26460 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
26470 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26480 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26490 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
264a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
264b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
264c0 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
264d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
264e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
264f0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
26500 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
26510 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
26520 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
26530 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
26540 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49    */.      CellI
26550 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
26560 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
26570 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
26580 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
26590 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e       assert( (in
265a0 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
265b0 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
265c0 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
265d0 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66  load );.      if
265e0 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
265f0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
26600 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e  nfo.nKey))>info.
26610 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
26620 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
26630 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
26640 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
26650 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
26660 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
26670 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  ->pBt, pgnoOvfl,
26680 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
26690 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
266a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
266b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
266c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
266d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
266e0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
266f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
26700 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
26710 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
26720 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
26730 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
26740 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
26750 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
26760 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
26770 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
26780 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
26790 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
267a0 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
267b0 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
267c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
267d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
267e0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
267f0 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
26800 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
26810 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
26820 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
26830 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
26840 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
26850 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
26860 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
26870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26880 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
26890 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20   int totalSize; 
268a0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
268b0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
268c0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
268d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
268e0 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
268f0 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20    int cellptr;  
26900 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
26910 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
26920 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
26930 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
26940 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
26950 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
26960 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
26970 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70  * Data for the p
26980 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
26990 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
269a0 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
269b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
269c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
269d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
269e0 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
269f0 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  & nCell<=MX_CELL
26a00 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
26a10 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
26a20 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 74  Bt)<=5460 );.  t
26a30 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20  otalSize = 0;.  
26a40 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
26a50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61  ; i++){.    tota
26a60 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69  lSize += aSize[i
26a70 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
26a80 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65   totalSize+2*nCe
26a90 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  ll<=pPage->nFree
26aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26ab0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
26ac0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26ad0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26ae0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
26af0 65 29 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20  e) );.  cellptr 
26b00 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
26b10 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
26b20 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
26b30 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
26b40 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65  fset;.  put2byte
26b50 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
26b60 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65  Cell);.  if( nCe
26b70 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f  ll ){.    cellbo
26b80 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  dy = allocateSpa
26b90 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53  ce(pPage, totalS
26ba0 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ize);.    assert
26bb0 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a  ( cellbody>0 );.
26bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26bd0 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43  e->nFree >= 2*nC
26be0 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ell );.    pPage
26bf0 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65  ->nFree -= 2*nCe
26c00 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ll;.    for(i=0;
26c10 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
26c20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
26c30 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63  data[cellptr], c
26c40 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20  ellbody);.      
26c50 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
26c60 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
26c70 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20  ], aSize[i]);.  
26c80 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32      cellptr += 2
26c90 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79  ;.      cellbody
26ca0 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
26cb0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
26cc0 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d  cellbody==pPage-
26cd0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
26ce0 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d   );.  }.  pPage-
26cf0 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
26d00 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
26d10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
26d20 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
26d30 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
26d40 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
26d50 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
26d60 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
26d70 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
26d80 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
26d90 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
26da0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
26db0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
26dc0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
26dd0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
26de0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
26df0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
26e00 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
26e10 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
26e20 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
26e30 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
26e40 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
26e50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
26e60 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
26e70 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
26e80 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
26e90 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
26ea0 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
26eb0 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
26ec0 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
26ed0 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
26ee0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
26ef0 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
26f00 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
26f10 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
26f20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
26f30 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
26f40 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
26f50 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
26f60 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
26f70 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
26f80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26f90 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
26fa0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
26fb0 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
26fc0 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
26fd0 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
26fe0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
26ff0 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46  balance */../* F
27000 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
27010 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62   */.static int b
27020 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 2a  alance(BtCursor*
27030 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66  , int);..#ifndef
27040 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
27050 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
27060 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
27070 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
27080 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
27090 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
270a0 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
270b0 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
270c0 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
270d0 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
270e0 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
270f0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
27100 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
27110 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
27120 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
27130 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
27140 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
27150 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
27160 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
27170 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
27180 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
27190 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
271a0 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
271b0 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
271c0 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
271d0 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
271e0 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
271f0 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
27200 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
27210 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
27220 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
27230 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
27240 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
27250 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
27260 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
27270 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
27280 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
27290 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
272a0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
272b0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
272c0 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
272d0 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
272e0 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
272f0 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
27300 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
27310 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
27320 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
27330 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
27340 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
27350 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
27360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
27370 61 6e 63 65 5f 71 75 69 63 6b 28 42 74 43 75 72  ance_quick(BtCur
27380 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
27390 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
273a0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 50 67 6e  *pNew = 0;.  Pgn
273b0 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20  o pgnoNew;.  u8 
273c0 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a  *pCell;.  u16 sz
273d0 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  Cell;.  CellInfo
273e0 20 69 6e 66 6f 3b 0a 20 20 4d 65 6d 50 61 67 65   info;.  MemPage
273f0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
27400 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27410 67 65 5d 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge];.  MemPage *
27420 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
27430 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27440 67 65 2d 31 5d 3b 0a 20 20 42 74 53 68 61 72 65  ge-1];.  BtShare
27450 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
27460 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e  pBt;.  int paren
27470 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e  tIdx = pParent->
27480 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72  nCell;   /* pPar
27490 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20  ent new divider 
274a0 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
274b0 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20  int parentSize; 
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77    /* Size of new
274e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
274f0 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c  .  u8 parentCell
27500 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [64];           
27510 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
27520 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  r the new divide
27530 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73  r cell */..  ass
27540 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27550 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
27560 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
27570 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
27580 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20  ew page. Insert 
27590 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
275a0 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a  l from pPage.  *
275b0 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20  * into it. Then 
275c0 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66  remove the overf
275d0 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
275e0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  age..  */.  rc =
275f0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
27600 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
27610 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
27620 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27630 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 65 6c 6c  _OK ){.    pCell
27640 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b   = pPage->aOvfl[
27650 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 73 7a  0].pCell;.    sz
27660 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
27670 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
27680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
27690 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
276a0 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
276b0 61 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  age) );.    zero
276c0 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65  Page(pNew, pPage
276d0 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
276e0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
276f0 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
27700 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  szCell);.    pPa
27710 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
27720 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50 61  0;.  .    /* pPa
27730 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
27740 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
27750 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
27760 67 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  ge this.    ** s
27770 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74  o that the right
27780 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65  -child is the ne
27790 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64  w page allocated
277a0 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20 2a   above and.    *
277b0 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e  * pPage is the n
277c0 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69  ext-to-right chi
277d0 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ld. .    **.    
277e0 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72 65  ** Ignore the re
277f0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
27800 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e  e call to fillIn
27810 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65  Cell(). fillInCe
27820 6c 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ll().    ** may 
27830 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68 65  only return othe
27840 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
27850 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69 72   if it is requir
27860 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
27870 20 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72     ** one or mor
27880 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
27890 2e 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65 72  . Since an inter
278a0 6e 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65 65  nal table B-Tree
278b0 20 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d 61   cell .    ** ma
278c0 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f 76  y never spill ov
278d0 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72 66  er onto an overf
278e0 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69 73 20  low page (it is 
278f0 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20 20  a maximum of .  
27900 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69 6e    ** 13 bytes in
27910 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f   size), it is no
27920 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f 20  t neccessary to 
27930 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
27940 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   code..    **.  
27950 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
27960 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29  the insertCell()
27970 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
27980 20 66 61 69 6c 20 69 66 20 74 68 65 20 70 61 67   fail if the pag
27990 65 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 69  e.    ** being i
279a0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73 20  nserted into is 
279b0 61 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c 65  already writable
279c0 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64 6f   and the cell do
279d0 65 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 63  es not .    ** c
279e0 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c  ontain an overfl
279f0 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69  ow pointer. So i
27a00 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75 72  gnore this retur
27a10 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20 20  n code too..    
27a20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
27a30 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
27a40 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
27a50 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
27a60 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
27a70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
27a80 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
27a90 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
27aa0 0a 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  .    fillInCell(
27ab0 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43  pParent, parentC
27ac0 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
27ad0 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72  y, 0, 0, 0, &par
27ae0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61 73  entSize);.    as
27af0 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65  sert( parentSize
27b00 3c 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  <64 );.    asser
27b10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
27b20 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
27b30 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
27b40 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
27b50 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64  Parent, parentId
27b60 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70  x, parentCell, p
27b70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29  arentSize, 0, 4)
27b80 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66  ;.    put4byte(f
27b90 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
27ba0 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64  pParent,parentId
27bb0 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  x), pPage->pgno)
27bc0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
27bd0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
27be0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
27bf0 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
27c00 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
27c10 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
27c20 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
27c30 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
27c40 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
27c50 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
27c60 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
27c70 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
27c80 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
27c90 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
27ca0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27cb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27cc0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
27cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
27ce0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
27cf0 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
27d00 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
27d10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
27d20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27d30 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
27d40 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29  PutOvfl(pNew, 0)
27d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27d60 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
27d70 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
27d80 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
27d90 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
27da0 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
27db0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
27dc0 20 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72 65   the pPage->nFre
27dd0 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  e variable is no
27de0 74 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 20  t set correctly 
27df0 77 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65 63  with.  ** respec
27e00 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  t to the content
27e10 20 6f 66 20 74 68 65 20 70 61 67 65 20 28 62 65   of the page (be
27e20 63 61 75 73 65 20 69 74 20 77 61 73 20 73 65 74  cause it was set
27e30 20 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20 69   to 0 by .  ** i
27e40 6e 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20 63  nsertCell). So c
27e50 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65  all sqlite3Btree
27e60 49 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d 61  InitPage() to ma
27e70 6b 65 20 73 75 72 65 20 69 74 20 69 73 0a 20 20  ke sure it is.  
27e80 2a 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a  ** correct..  **
27e90 0a 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20 74  .  ** This has t
27ea0 6f 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20 69  o be done even i
27eb0 66 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c 20  f an error will 
27ec0 62 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f 72  be returned. Nor
27ed0 6d 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20 61  mally, if.  ** a
27ee0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
27ef0 75 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61 6e  uring tree balan
27f00 63 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cing, the conten
27f10 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72  ts of MemPage ar
27f20 65 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72  e.  ** not impor
27f30 74 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77 69  tant, as they wi
27f40 6c 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61 74  ll be recalculat
27f50 65 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ed when the page
27f60 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
27f70 62 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c 20  back. But here, 
27f80 69 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  in balance_quick
27f90 28 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  (), it is possib
27fa0 6c 65 20 74 68 61 74 20 70 50 61 67 65 20 68 61  le that pPage ha
27fb0 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20  s .  ** not yet 
27fc0 62 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72 74  been marked dirt
27fd0 79 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e 74  y or written int
27fe0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
27ff0 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20 20  le. Therefore.  
28000 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  ** it will not b
28010 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
28020 64 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f 72  d so it is impor
28030 74 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  tant to make sur
28040 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
28050 70 61 67 65 20 64 61 74 61 20 61 6e 64 20 63 6f  page data and co
28060 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67  ntents of MemPag
28070 65 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74  e are consistent
28080 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e  ..  */.  pPage->
28090 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 71  isInit = 0;.  sq
280a0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
280b0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73  ge(pPage);.  ass
280c0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
280d0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f  rflow==0 );..  /
280e0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
280f0 65 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c 20  else succeeded, 
28100 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
28110 6e 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20 2a  nt page, in .  *
28120 2a 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64  * case the divid
28130 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  er cell inserted
28140 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65   caused it to be
28150 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20  come overfull.. 
28160 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
28170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
28180 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
28190 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  );.    pCur->iPa
281a0 67 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20 62  ge--;.    rc = b
281b0 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b  alance(pCur, 0);
281c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
281d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
281e0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
281f0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALANCE */../*.**
28200 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
28210 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
28220 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
28230 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
28240 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
28250 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
28260 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
28270 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
28280 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
28290 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
282a0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
282b0 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
282c0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
282d0 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
282e0 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
282f0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
28300 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
28310 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
28320 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
28330 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
28340 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
28350 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
28360 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
28370 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
28380 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
28390 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
283a0 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
283b0 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
283c0 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
283d0 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
283e0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
283f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
28400 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
28410 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
28420 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
28430 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
28440 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
28450 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
28460 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
28470 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
28480 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
28490 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
284a0 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
284b0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
284c0 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
284d0 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
284e0 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
284f0 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
28500 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
28510 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
28520 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
28530 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
28540 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
28550 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
28560 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
28570 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
28580 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
28590 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
285a0 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
285b0 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
285c0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
285d0 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
285e0 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
285f0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
28600 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
28610 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
28620 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
28630 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
28640 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
28650 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
28660 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
28670 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
28680 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
28690 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
286a0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
286b0 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
286c0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
286d0 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
286e0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
286f0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
28700 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
28710 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
28720 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
28730 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
28740 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
28750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
28760 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
28770 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
28780 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
28790 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
287a0 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20  d state.  So if 
287b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
287c0 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
287d0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
287e0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
287f0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
28800 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73 6f  _nonroot(BtCurso
28810 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
28820 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
28830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28840 6f 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75 6c  over or underful
28850 6c 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e 63  l page to balanc
28860 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
28870 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
28880 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
28890 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  t of pPage */.  
288a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
288c0 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61  The whole databa
288d0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  se */.  int nCel
288e0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
288f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28900 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
28910 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  l[] */.  int nMa
28920 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20  xCells = 0;     
28930 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
28940 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c  ed size of apCel
28950 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d  l, szCell, aFrom
28960 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 20  . */.  int nOld 
28970 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
28980 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28990 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b   pages in apOld[
289a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20  ] */.  int nNew 
289b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
289c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
289d0 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b   pages in apNew[
289e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b  ] */.  int nDiv;
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
28a10 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b   cells in apDiv[
28a20 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ] */.  int i, j,
28a30 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
28a40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
28a50 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ters */.  int id
28a60 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
28a70 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
28a80 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72  of pPage in pPar
28a90 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
28aa0 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28ac0 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
28ad0 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
28ae0 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
28af0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
28b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28b10 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
28b20 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63    int leafCorrec
28b30 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
28b40 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
28b50 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
28b60 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
28b70 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28b80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
28b90 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
28ba0 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
28bb0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
28bc0 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
28bd0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
28be0 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
28bf0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
28c00 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
28c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
28c20 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
28c30 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
28c40 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
28c50 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
28c60 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
28c70 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
28c80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
28c90 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
28ca0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
28cb0 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
28cc0 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ce1[] */.  int i
28cd0 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20  Space2 = 0;     
28ce0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
28cf0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
28d00 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69  aSpace2[] */.  i
28d10 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
28d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28d30 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
28d40 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
28d50 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
28d60 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
28d70 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
28d80 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
28d90 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
28da0 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
28db0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
28dc0 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
28dd0 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
28de0 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
28df0 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
28e00 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
28e10 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
28e20 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
28e30 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
28e40 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
28e50 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
28e60 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
28e70 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
28e80 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
28e90 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
28ea0 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
28eb0 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
28ec0 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d  .  u8 *apDiv[NB]
28ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28ee0 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
28ef0 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
28f00 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
28f10 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
28f20 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
28f30 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
28f40 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
28f50 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
28f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
28f70 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
28f80 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
28f90 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
28fa0 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
28fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
28fc0 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
28fd0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
28fe0 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
28ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
29000 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
29010 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
29020 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e  */.  u8 *aCopy[N
29030 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  B];         /* S
29040 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67  pace for holding
29050 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b   data of apCopy[
29060 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
29070 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e1;           /*
29080 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
29090 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
290a0 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e  lls before balan
290b0 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  ce */.  u8 *aSpa
290c0 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ce2 = 0;       /
290d0 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72  * Space for over
290e0 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65  flow dividers ce
290f0 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  lls after balanc
29100 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d  e */.  u8 *aFrom
29110 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
29120 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29130 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
29140 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29150 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
29160 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
29170 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
29180 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
29190 20 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a   1 );..  /* .  *
291a0 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e  * Find the paren
291b0 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
291c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
291d0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
291e0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
291f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
29200 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29210 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
29220 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  age) || pPage->n
29230 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
29240 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
29250 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
29260 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29270 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73  ->iPage-1];.  as
29280 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b  sert( pParent );
29290 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
292a0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
292b0 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e  agerWrite(pParen
292c0 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  t->pDbPage)) ){.
292d0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
292e0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20  _cleanup;.  }.. 
292f0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
29300 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
29310 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
29320 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
29330 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23  rent->pgno));..#
29340 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29350 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
29360 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63    /*.  ** A spec
29370 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20  ial case:  If a 
29380 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75  new entry has ju
29390 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  st been inserted
293a0 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62   into a.  ** tab
293b0 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62  le (that is, a b
293c0 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65  tree with intege
293d0 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64  r keys and all d
293e0 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65  ata at the leave
293f0 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  s).  ** and the 
29400 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65  new entry is the
29410 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
29420 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69  y in the tree (i
29430 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c  t has the.  ** l
29440 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e  argest key) then
29450 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c   use the special
29460 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
29470 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a   routine for.  *
29480 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61  * balancing.  ba
29490 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
294a0 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64   much faster and
294b0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69   results in a ti
294c0 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69  ghter.  ** packi
294d0 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  ng of data in th
294e0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
294f0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
29500 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70  >leaf &&.      p
29510 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a  Page->intKey &&.
29520 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
29530 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20  erflow==1 &&.   
29540 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
29550 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
29560 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50  Cell &&.      pP
29570 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26  arent->pgno!=1 &
29580 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65  &.      get4byte
29590 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
295a0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
295b0 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+8])==pPage->
295c0 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73  pgno.  ){.    as
295d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
295e0 4b 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20  Key );.    /*.  
295f0 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    ** TODO: Check
29600 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f   the siblings to
29610 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61   the left of pPa
29620 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68  ge. It may be th
29630 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61  at.    ** they a
29640 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20  re not full and 
29650 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72  no new page is r
29660 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
29670 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e      return balan
29680 63 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b 0a  ce_quick(pCur);.
29690 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
296a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
296b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
296c0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
296d0 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  age)) ){.    got
296e0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
296f0 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  p;.  }..  /*.  *
29700 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20  * Find the cell 
29710 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
29720 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68  ge whose left ch
29730 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a  ild points back.
29740 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20    ** to pPage.  
29750 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62  The "idx" variab
29760 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  le is the index 
29770 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49  of that cell.  I
29780 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20  f pPage.  ** is 
29790 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68  the rightmost ch
297a0 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ild of pParent t
297b0 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70  hen set idx to p
297c0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20  Parent->nCell . 
297d0 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72   */.  idx = pCur
297e0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
297f0 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  age-1];.  assert
29800 50 61 72 65 6e 74 49 6e 64 65 78 28 70 50 61 72  ParentIndex(pPar
29810 65 6e 74 2c 20 69 64 78 2c 20 70 50 61 67 65 2d  ent, idx, pPage-
29820 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
29830 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20  ** Find sibling 
29840 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61  pages to pPage a
29850 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  nd the cells in 
29860 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76  pParent that div
29870 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62  ide.  ** the sib
29880 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d  lings.  An attem
29890 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
298a0 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
298b0 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69  n either.  ** si
298c0 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f  de of pPage.  Mo
298d0 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
298e0 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
298f0 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66  ide, however, if
29900 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72  .  ** pPage ther
29910 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
29920 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
29930 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
29940 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
29950 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
29960 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
29970 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
29980 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
29990 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d  ..  */.  nxDiv =
299a0 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28   idx - NN;.  if(
299b0 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50   nxDiv + NB > pP
299c0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
299d0 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72      nxDiv = pPar
299e0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20  ent->nCell - NB 
299f0 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  + 1;.  }.  if( n
29a00 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78  xDiv<0 ){.    nx
29a10 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  Div = 0;.  }.  n
29a20 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  Div = 0;.  for(i
29a30 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
29a40 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
29a50 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
29a60 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
29a70 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
29a80 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
29a90 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20  .      nDiv++;. 
29aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
29ab0 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20  arent->leaf );. 
29ac0 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
29ad0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
29ae0 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [i]);.    }else 
29af0 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e  if( k==pParent->
29b00 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  nCell ){.      p
29b10 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
29b20 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
29b30 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
29b40 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
29b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
29b60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
29b70 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
29b80 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b  ge(pBt, pgnoOld[
29b90 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  i], &apOld[i]);.
29ba0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
29bb0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29bc0 70 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c 64 5b  p;.    /* apOld[
29bd0 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20  i]->idxParent = 
29be0 6b 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f 70 79  k; */.    apCopy
29bf0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  [i] = 0;.    ass
29c00 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a  ert( i==nOld );.
29c10 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20      nOld++;.    
29c20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
29c30 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
29c40 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
29c50 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ow;.  }..  /* Ma
29c60 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d  ke nMaxCells a m
29c70 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20  ultiple of 4 in 
29c80 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76  order to preserv
29c90 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c  e 8-byte.  ** al
29ca0 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61  ignment */.  nMa
29cb0 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65  xCells = (nMaxCe
29cc0 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20  lls + 3)&~3;..  
29cd0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
29ce0 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
29cf0 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a  y structures.  *
29d00 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a  /.  szScratch =.
29d10 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73         nMaxCells
29d20 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20  *sizeof(u8*)    
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a     /* apCell */.
29d50 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73       + nMaxCells
29d60 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20  *sizeof(u16)    
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a     /* szCell */.
29d90 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73       + (ROUND8(s
29da0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b  izeof(MemPage))+
29db0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e  pBt->pageSize)*N
29dc0 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20  B  /* aCopy */. 
29dd0 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
29de0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e00 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a    /* aSpace1 */.
29e10 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41       + (ISAUTOVA
29e20 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73  CUUM ? nMaxCells
29e30 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20 20   : 0);          
29e40 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20     /* aFrom */. 
29e50 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
29e60 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20  3ScratchMalloc( 
29e70 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20  szScratch ); .  
29e80 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
29e90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
29ea0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
29eb0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
29ec0 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
29ed0 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e   (u16*)&apCell[n
29ee0 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f  MaxCells];.  aCo
29ef0 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a  py[0] = (u8*)&sz
29f00 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
29f10 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f  .  assert( ((aCo
29f20 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 30 29 20  py[0] - (u8*)0) 
29f30 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
29f40 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
29f50 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72  equired */.  for
29f60 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29  (i=1; i<NB; i++)
29f70 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d  {.    aCopy[i] =
29f80 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74   &aCopy[i-1][pBt
29f90 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
29fa0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
29fb0 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ))];.    assert(
29fc0 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75   ((aCopy[i] - (u
29fd0 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20 29 3b  8*)0) & 7)==0 );
29fe0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
29ff0 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
2a000 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20 3d  .  }.  aSpace1 =
2a010 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42   &aCopy[NB-1][pB
2a020 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
2a030 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
2a040 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e))];.  assert( 
2a050 28 28 61 53 70 61 63 65 31 20 2d 20 28 75 38 2a  ((aSpace1 - (u8*
2a060 29 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  )0) & 7)==0 ); /
2a070 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
2a080 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
2a090 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2a0a0 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d  M ){.    aFrom =
2a0b0 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70   &aSpace1[pBt->p
2a0c0 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20  ageSize];.  }.  
2a0d0 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74 65  aSpace2 = sqlite
2a0e0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d  3PageMalloc(pBt-
2a0f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
2a100 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a  ( aSpace2==0 ){.
2a110 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a120 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
2a130 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2a140 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
2a150 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
2a160 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2a170 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
2a180 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
2a190 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
2a1a0 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
2a1b0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
2a1c0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
2a1d0 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
2a1e0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
2a1f0 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
2a200 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
2a210 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
2a220 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
2a230 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
2a240 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2a250 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
2a260 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
2a270 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
2a280 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20  age*)aCopy[i];. 
2a290 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f     memcpy(p, apO
2a2a0 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
2a2b0 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e  mPage));.    p->
2a2c0 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  aData = (void*)&
2a2d0 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  p[1];.    memcpy
2a2e0 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  (p->aData, apOld
2a2f0 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
2a300 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
2a310 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
2a320 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
2a330 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
2a340 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
2a350 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
2a360 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
2a370 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
2a380 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
2a390 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2a3a0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
2a3b0 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d  ce obtained form
2a3c0 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
2a3d0 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
2a3e0 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
2a3f0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
2a400 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
2a410 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
2a420 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
2a430 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
2a440 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
2a450 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
2a460 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
2a470 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
2a480 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
2a490 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
2a4a0 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
2a4b0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
2a4c0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
2a4d0 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
2a4e0 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
2a4f0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
2a500 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
2a510 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
2a520 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
2a530 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2a540 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
2a550 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2a560 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
2a570 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
2a580 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
2a590 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2a5a0 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
2a5b0 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
2a5c0 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
2a5d0 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
2a5e0 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
2a5f0 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
2a600 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
2a610 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c    nCell = 0;.  l
2a620 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
2a630 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20  pPage->leaf*4;. 
2a640 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61 67   leafData = pPag
2a650 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f  e->hasData;.  fo
2a660 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
2a670 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
2a680 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
2a690 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  i];.    int limi
2a6a0 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
2a6b0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
2a6c0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
2a6d0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
2a6e0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2a6f0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2a700 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
2a710 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
2a720 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
2a730 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2a740 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
2a750 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
2a760 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  ell]);.      if(
2a770 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2a780 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a  .        int a;.
2a790 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
2a7a0 65 6c 6c 5d 20 3d 20 28 75 38 29 69 3b 20 20 20  ell] = (u8)i;   
2a7b0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
2a7c0 69 3c 36 20 29 3b 0a 20 20 20 20 20 20 20 20 66  i<6 );.        f
2a7d0 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
2a7e0 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
2a7f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2a800 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
2a810 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
2a820 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
2a830 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
2a840 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
2a850 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2a870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
2a880 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
2a890 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b   if( i<nOld-1 ){
2a8a0 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
2a8b0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
2a8c0 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
2a8d0 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
2a8e0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
2a8f0 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41   With the LEAFDA
2a900 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74  TA flag, pParent
2a910 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79   cells hold only
2a920 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20   INTKEYs that.  
2a930 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70        ** are dup
2a940 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20  licates of keys 
2a950 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  on the child pag
2a960 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  es.  We need to 
2a970 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  remove.        *
2a980 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  * the divider ce
2a990 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74  lls from pParent
2a9a0 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65  , but the divide
2a9b0 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74  rs cells are not
2a9c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
2a9d0 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65  d to apCell[] be
2a9e0 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64  cause they are d
2a9f0 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69  uplicates of chi
2aa00 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20  ld cells..      
2aa10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f    */.        dro
2aa20 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
2aa30 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
2aa40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2aa50 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
2aa60 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2aa70 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2aa80 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2aa90 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
2aaa0 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
2aab0 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
2aac0 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
2aad0 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
2aae0 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
2aaf0 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
2ab00 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
2ab10 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e1<=pBt->pageSiz
2ab20 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e );.        mem
2ab30 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
2ab40 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
2ab50 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
2ab60 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
2ab70 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
2ab80 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2ab90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
2aba0 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
2abb0 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  F;.        }.   
2abc0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2abd0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
2abe0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2abf0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
2ac00 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
2ac10 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
2ac20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2ac30 6c 5d 20 2d 3d 20 28 75 31 36 29 6c 65 61 66 43  l] -= (u16)leafC
2ac40 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2ac50 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2ac60 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f  yte(pTemp)==pgno
2ac70 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20  Old[i] );.      
2ac80 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
2ac90 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  f ){.          a
2aca0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
2acb0 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
2acc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
2acd0 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
2ace0 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
2acf0 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
2ad00 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ft.          ** 
2ad10 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
2ad20 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
2ad30 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2ad40 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
2ad50 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64  pOld->aData[pOld
2ad60 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2ad70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
2ad80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2ad90 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2ada0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
2adb0 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
2adc0 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
2add0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2ade0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
2adf0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
2ae00 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
2ae10 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2ae20 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
2ae30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2ae40 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
2ae50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ae60 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
2ae70 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
2ae80 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
2ae90 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
2aea0 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
2aeb0 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
2aec0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
2aed0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
2aee0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
2aef0 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
2af00 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
2af10 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
2af20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
2af30 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
2af40 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
2af50 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
2af60 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
2af70 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
2af80 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
2af90 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
2afa0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
2afb0 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
2afc0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
2afd0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
2afe0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
2aff0 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
2b000 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
2b010 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
2b020 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
2b030 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
2b040 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
2b050 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
2b060 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
2b070 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
2b080 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
2b090 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
2b0a0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
2b0b0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
2b0c0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
2b0d0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
2b0e0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
2b0f0 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
2b100 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
2b110 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
2b120 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
2b130 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2b140 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
2b150 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
2b160 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
2b170 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
2b180 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
2b190 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
2b1a0 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
2b1b0 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
2b1c0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
2b1d0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
2b1e0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
2b1f0 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
2b200 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
2b210 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
2b220 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
2b230 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20      k++;.    }. 
2b240 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
2b250 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
2b260 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
2b270 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
2b280 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
2b290 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
2b2a0 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
2b2b0 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
2b2c0 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
2b2d0 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
2b2e0 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
2b2f0 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
2b300 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
2b310 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
2b320 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
2b330 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
2b340 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
2b350 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
2b360 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
2b370 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
2b380 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
2b390 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
2b3a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
2b3b0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
2b3c0 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
2b3d0 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
2b3e0 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
2b3f0 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
2b400 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
2b410 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
2b420 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
2b430 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
2b440 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
2b450 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
2b460 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
2b470 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
2b480 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
2b490 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
2b4a0 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
2b4b0 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
2b4c0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
2b4d0 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
2b4e0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
2b4f0 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
2b500 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
2b510 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
2b520 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
2b530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2b540 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
2b550 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
2b560 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
2b570 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
2b580 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2b590 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
2b5a0 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
2b5b0 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
2b5c0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
2b5d0 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
2b5e0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
2b5f0 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
2b600 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
2b610 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
2b620 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
2b630 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
2b640 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
2b650 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
2b660 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
2b670 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
2b680 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
2b690 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
2b6a0 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
2b6b0 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
2b6c0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
2b6d0 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
2b6e0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
2b6f0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
2b700 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
2b710 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
2b720 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
2b730 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
2b740 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
2b750 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
2b760 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20 74  )>0) or we are t
2b770 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  he.  ** a virtua
2b780 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
2b790 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2b7a0 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
2b7b0 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
2b7c0 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
2b7d0 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
2b7e0 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
2b7f0 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
2b800 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
2b810 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
2b820 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
2b830 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20  nCell==0) );..  
2b840 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
2b850 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
2b860 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
2b870 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
2b880 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2b890 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
2b8a0 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61   pageFlags = pPa
2b8b0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  ge->aData[0];.  
2b8c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
2b8d0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
2b8e0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
2b8f0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
2b900 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
2b910 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
2b920 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
2b930 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  noOld[i];.      
2b940 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
2b950 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b960 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
2b970 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2b980 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
2b990 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2b9a0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2b9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2b9c0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
2b9d0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2b9e0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2b9f0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b  &pNew, &pgnoNew[
2ba00 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d  i], pgnoNew[i-1]
2ba10 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2ba20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
2ba30 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2ba40 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
2ba50 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
2ba60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ba70 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
2ba80 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
2ba90 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
2baa0 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
2bab0 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
2bac0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2bad0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
2bae0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2baf0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2bb00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
2bb10 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
2bb20 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
2bb30 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
2bb40 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
2bb50 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
2bb60 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
2bb70 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
2bb80 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
2bb90 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
2bba0 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
2bbb0 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
2bbc0 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
2bbd0 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
2bbe0 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
2bbf0 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
2bc00 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
2bc10 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
2bc20 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
2bc30 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
2bc40 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
2bc50 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
2bc60 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
2bc70 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
2bc80 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
2bc90 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
2bca0 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
2bcb0 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
2bcc0 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
2bcd0 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
2bce0 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
2bcf0 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
2bd00 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
2bd10 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
2bd20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
2bd30 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
2bd40 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
2bd50 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
2bd60 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
2bd70 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
2bd80 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
2bd90 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
2bda0 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
2bdb0 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
2bdc0 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75  f( pgnoNew[j]<(u
2bdd0 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
2bde0 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
2bdf0 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
2be00 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20   pgnoNew[j];.   
2be10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2be20 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
2be30 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
2be40 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
2be50 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69     t = pgnoNew[i
2be60 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  ];.      pT = ap
2be70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  New[i];.      pg
2be80 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e  noNew[i] = pgnoN
2be90 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
2bea0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
2beb0 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67  [minI];.      pg
2bec0 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b  noNew[minI] = t;
2bed0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
2bee0 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
2bef0 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   }.  TRACE(("BAL
2bf00 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
2bf10 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64 29   %d  new: %d(%d)
2bf20 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
2bf30 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
2bf40 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c  .    pgnoOld[0],
2bf50 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
2bf60 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a  pgnoOld[1] : 0,.
2bf70 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67      nOld>=3 ? pg
2bf80 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20  noOld[2] : 0,.  
2bf90 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a    pgnoNew[0], sz
2bfa0 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
2bfb0 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d  >=2 ? pgnoNew[1]
2bfc0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
2bfd0 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
2bfe0 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f    nNew>=3 ? pgno
2bff0 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[2] : 0, nNew
2c000 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
2c010 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
2c020 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30  ? pgnoNew[3] : 0
2c030 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
2c040 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
2c050 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=5 ? pgnoNew[
2c060 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  4] : 0, nNew>=5 
2c070 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
2c080 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
2c090 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
2c0a0 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
2c0b0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
2c0c0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
2c0d0 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
2c0e0 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
2c0f0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
2c100 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
2c110 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
2c120 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
2c130 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
2c140 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
2c150 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
2c160 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
2c170 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
2c180 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
2c190 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d  rt( pNew->pgno==
2c1a0 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20  pgnoNew[i] );.  
2c1b0 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
2c1c0 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
2c1d0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
2c1e0 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
2c1f0 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
2c200 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
2c210 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
2c220 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
2c230 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
2c240 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c250 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
2c260 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  =0 );..    /* If
2c270 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2c280 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2c290 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2c2a0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
2c2b0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  .    ** that poi
2c2c0 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69 6e  nt to the siblin
2c2d0 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65 61  gs that were rea
2c2e0 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20 63  rranged. These c
2c2f0 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20 20  an be: left.    
2c300 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 63  ** children of c
2c310 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74 2d  ells, the right-
2c320 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 67  child of the pag
2c330 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e, or overflow p
2c340 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ages.    ** poin
2c350 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e  ted to by cells.
2c360 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2c370 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2c380 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
2c390 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
2c3a0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2c3b0 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
2c3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
2c3d0 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
2c3e0 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
2c3f0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
2c400 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
2c410 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2c420 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
2c430 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2c440 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61  SQLITE_OK && lea
2c450 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
2c460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2c470 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2c480 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
2c490 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[k]), PTRMAP_BT
2c4a0 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
2c4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c4c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2c4d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c4e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2c4f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2c500 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c510 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c520 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e   }..    j = cntN
2c530 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
2c540 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
2c550 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
2c560 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
2c570 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2c580 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
2c590 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
2c5a0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
2c5b0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2c5c0 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26   if( i<nNew-1 &&
2c5d0 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
2c5e0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
2c5f0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2c600 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
2c610 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
2c620 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2c630 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
2c640 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
2c650 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
2c660 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2c670 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 32  pTemp = &aSpace2
2c680 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20 20  [iSpace2];.     
2c690 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
2c6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
2c6b0 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
2c6c0 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
2c6d0 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54         if( ISAUT
2c6e0 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20 20 20  OVACUUM .       
2c6f0 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d    && (aFrom[j]==
2c700 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
2c710 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[j]]->pgno!=
2c720 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20  pNew->pgno).    
2c730 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2c740 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2c750 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2c760 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  ell), PTRMAP_BTR
2c770 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  EE, pNew->pgno);
2c780 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2c790 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2c7b0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2c7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2c7e0 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
2c7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2c800 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
2c810 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
2c820 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
2c830 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
2c840 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2c850 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
2c860 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
2c870 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
2c880 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
2c890 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
2c8a0 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
2c8b0 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
2c8c0 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
2c8d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2c8e0 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
2c8f0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
2c900 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
2c910 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
2c920 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
2c930 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  -;.        sqlit
2c940 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
2c950 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
2c960 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
2c970 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
2c980 6d 70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mp;.        rc =
2c990 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
2c9a0 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69  ent, pCell, 0, i
2c9b0 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
2c9c0 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20  0, &sz);.       
2c9d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c9e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2c9f0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2ca00 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
2ca10 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
2ca20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2ca30 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
2ca40 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
2ca50 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
2ca60 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
2ca70 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
2ca80 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
2ca90 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
2caa0 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
2cab0 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
2cac0 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
2cad0 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
2cae0 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
2caf0 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
2cb00 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
2cb10 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
2cb20 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  see sqlite3Btree
2cb30 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
2cb40 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
2cb50 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
2cb60 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
2cb70 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
2cb80 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
2cb90 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
2cba0 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
2cbb0 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
2cbc0 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
2cbd0 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
2cbe0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
2cbf0 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
2cc00 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
2cc10 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
2cc20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
2cc30 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
2cc40 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
2cc50 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
2cc60 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
2cc70 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
2cc80 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
2cc90 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
2cca0 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
2ccb0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2ccc0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
2ccd0 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
2cce0 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
2ccf0 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
2cd00 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
2cd10 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
2cd20 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
2cd30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2cd40 20 20 69 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b    iSpace2 += sz;
2cd50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2cd60 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
2cd70 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  /4 );.      asse
2cd80 72 74 28 20 69 53 70 61 63 65 32 3c 3d 70 42 74  rt( iSpace2<=pBt
2cd90 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
2cda0 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43      rc = insertC
2cdb0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
2cdc0 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70  iv, pCell, sz, p
2cdd0 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20  Temp, 4);.      
2cde0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cdf0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
2ce00 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2ce10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2ce20 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2ce30 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2ce40 29 20 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ) );.      put4b
2ce50 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
2ce60 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44  Cell(pParent,nxD
2ce70 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  iv), pNew->pgno)
2ce80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
2ce90 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2cea0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2ceb0 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64  and not a leaf-d
2cec0 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20  ata tree,.      
2ced0 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20 74  ** then update t
2cee0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77  he pointer map w
2cef0 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ith an entry for
2cf00 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2cf10 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ge.      ** that
2cf20 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69   the cell just i
2cf30 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74  nserted points t
2cf40 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  o (if any)..    
2cf50 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49    */.      if( I
2cf60 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21  SAUTOVACUUM && !
2cf70 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
2cf80 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2cf90 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20  utOvfl(pParent, 
2cfa0 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20  nxDiv);.        
2cfb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cfc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
2cfd0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2cfe0 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nup;.        }. 
2cff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b       }.      j++
2d000 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
2d010 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
2d020 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
2d030 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
2d040 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
2d050 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  e. */.    if( IS
2d060 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2d070 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2d080 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67  ut(pBt, pNew->pg
2d090 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
2d0a0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
2d0b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d0c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d0d0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2d0e0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
2d0f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
2d100 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20  ssert( j==nCell 
2d110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c  );.  assert( nOl
2d120 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
2d130 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28   nNew>0 );.  if(
2d140 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54   (pageFlags & PT
2d150 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20  F_LEAF)==0 ){.  
2d160 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26    u8 *zChild = &
2d170 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
2d180 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65  aData[8];.    me
2d190 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
2d1a0 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a  -1]->aData[8], z
2d1b0 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69  Child, 4);.    i
2d1c0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2d1d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2d1e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
2d1f0 34 62 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50  4byte(zChild), P
2d200 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e  TRMAP_BTREE, apN
2d210 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f  ew[nNew-1]->pgno
2d220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d240 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2d250 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2d260 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2d270 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2d280 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2d290 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2d2a0 29 20 29 3b 0a 20 20 69 66 28 20 6e 78 44 69 76  ) );.  if( nxDiv
2d2b0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
2d2c0 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  +pParent->nOverf
2d2d0 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69  low ){.    /* Ri
2d2e0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
2d2f0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
2d300 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  st child of pPar
2d310 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ent */.    put4b
2d320 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2d330 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2d340 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
2d350 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d  ew[nNew-1]);.  }
2d360 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67  else{.    /* Rig
2d370 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
2d380 69 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c  is the left chil
2d390 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65  d of the first e
2d3a0 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a  ntry in pParent.
2d3b0 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
2d3c0 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64  right-most divid
2d3d0 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  er entry */.    
2d3e0 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
2d3f0 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
2d400 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e  t, nxDiv), pgnoN
2d410 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d  ew[nNew-1]);.  }
2d420 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61  ..  /*.  ** Bala
2d430 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
2d440 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  age.  Note that 
2d450 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2d460 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20   (pPage) might. 
2d470 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64   ** have been ad
2d480 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2d490 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20  ist so it might 
2d4a0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69  no longer be ini
2d4b0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42  tialized..  ** B
2d4c0 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ut the parent pa
2d4d0 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ge will always b
2d4e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
2d4f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2d500 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
2d510 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  .  sqlite3Scratc
2d520 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  hFree(apCell);. 
2d530 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 54   apCell = 0;.  T
2d540 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2d550 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 25 64  finished with %d
2d560 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
2d570 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
2d580 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67         pPage->pg
2d590 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20  no, nOld, nNew, 
2d5a0 6e 43 65 6c 6c 29 29 3b 0a 20 20 70 50 61 67 65  nCell));.  pPage
2d5b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
2d5c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2d5d0 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69  Page);.  pCur->i
2d5e0 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62  Page--;.  rc = b
2d5f0 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b  alance(pCur, 0);
2d600 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c  .  .  /*.  ** Cl
2d610 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74  eanup before ret
2d620 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c  urning..  */.bal
2d630 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  ance_cleanup:.  
2d640 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
2d650 61 53 70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69  aSpace2);.  sqli
2d660 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61  te3ScratchFree(a
2d670 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
2d680 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
2d690 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2d6a0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
2d6b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
2d6c0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
2d6d0 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
2d6e0 5d 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  ]);.  }.  pCur->
2d6f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d700 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ge]->nOverflow =
2d710 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63   0;..  return rc
2d720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2d730 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2d740 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
2d750 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
2d760 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
2d770 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
2d780 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
2d790 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
2d7a0 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
2d7b0 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
2d7c0 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
2d7d0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2d7e0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42 74 43 75  e_shallower(BtCu
2d7f0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2d800 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
2d810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2d820 6f 6f 74 20 70 61 67 65 20 6f 66 20 42 2d 54 72  oot page of B-Tr
2d830 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
2d840 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  *pChild;        
2d850 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
2d860 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70   child page of p
2d870 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Page */.  Pgno p
2d880 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20  gnoChild;       
2d890 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2d8a0 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64  umber for pChild
2d8b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2d8c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d8d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2d8e0 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
2d8f0 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72  ures */.  BtShar
2d900 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2d910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d920 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72 75   main BTree stru
2d930 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  cture */.  int m
2d940 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20  xCellPerPage;   
2d950 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2d960 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  um number of cel
2d970 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20  ls per page */. 
2d980 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20   u8 **apCell;   
2d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d9a0 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20   All cells from 
2d9b0 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61  pages being bala
2d9c0 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73  nced */.  u16 *s
2d9d0 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
2d9e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
2d9f0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
2da00 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
2da10 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2da20 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2da30 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20  ->apPage[0];..  
2da40 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2da50 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
2da60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2da70 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2da80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2da90 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2daa0 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
2dab0 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
2dac0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
2dad0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65  ite3Malloc( mxCe
2dae0 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f  llPerPage*(sizeo
2daf0 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31  f(u8*)+sizeof(u1
2db00 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43  6)) );.  if( apC
2db10 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
2db20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2db30 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
2db40 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72  apCell[mxCellPer
2db50 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Page];.  if( pPa
2db60 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2db70 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  /* The table is 
2db80 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
2db90 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22   */.    TRACE(("
2dba0 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74  BALANCE: empty t
2dbb0 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  able %d\n", pPag
2dbc0 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
2dbd0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
2dbe0 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
2dbf0 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
2dc00 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
2dc10 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  he.    ** inform
2dc20 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20  ation from that 
2dc30 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74  one child into t
2dc40 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20  he root page if 
2dc50 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
2dc60 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
2dc70 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
2dc80 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
2dc90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2dca0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2dcb0 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61  is page 1, it ha
2dcc0 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61  s less space ava
2dcd0 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20  ilable than.    
2dce0 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75  ** its child (du
2dcf0 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74  e to the 100 byt
2dd00 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63  e header that oc
2dd10 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69  curs at the begi
2dd20 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
2dd30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65  the database fle
2dd40 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  ), so it might n
2dd50 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f  ot be able to ho
2dd60 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20  ld all of the . 
2dd70 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
2dd80 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  n currently cont
2dd90 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69  ained in the chi
2dda0 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ld.  If this is 
2ddb0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65  the .    ** case
2ddc0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
2ddd0 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
2dde0 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
2ddf0 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  ty except.    **
2de00 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
2de10 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
2de20 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63  ild page.  The c
2de30 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65  hild page become
2de40 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72  s.    ** the vir
2de50 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
2de60 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   tree..    */.  
2de70 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72    VVA_ONLY( pCur
2de80 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20  ->pagesShuffled 
2de90 3d 20 31 20 29 3b 0a 20 20 20 20 70 67 6e 6f 43  = 1 );.    pgnoC
2dea0 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2deb0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2dec0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2ded0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2dee0 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20  pgnoChild>0 );. 
2def0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
2df00 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63  hild<=pagerPagec
2df10 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 29  ount(pPage->pBt)
2df20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2df30 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2df40 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e  (pPage->pBt, pgn
2df50 6f 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c  oChild, &pChild,
2df60 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
2df70 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
2df80 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
2df90 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  if( pPage->pgno=
2dfa0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =1 ){.      rc =
2dfb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2dfc0 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  tPage(pChild);. 
2dfd0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2dfe0 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
2dff0 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73  alance;.      as
2e000 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f  sert( pChild->nO
2e010 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
2e020 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
2e030 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20  nFree>=100 ){.  
2e040 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
2e050 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ld information w
2e060 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
2e070 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20  oot page, so do 
2e080 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
2e090 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  opy */.        i
2e0a0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65  nt i;.        ze
2e0b0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
2e0c0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  hild->aData[0]);
2e0d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2e0e0 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
2e0f0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
2e100 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66     apCell[i] = f
2e110 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69  indCell(pChild,i
2e120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43  );.          szC
2e130 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  ell[i] = cellSiz
2e140 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43  ePtr(pChild, apC
2e150 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ell[i]);.       
2e160 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d   }.        assem
2e170 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70  blePage(pPage, p
2e180 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70  Child->nCell, ap
2e190 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20  Cell, szCell);. 
2e1a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74         /* Copy t
2e1b0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
2e1c0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f   of the child to
2e1d0 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   the parent. */.
2e1e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e1f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e200 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2e210 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2e220 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2e230 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2e240 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a  >hdrOffset+8], .
2e250 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
2e260 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44  byte(&pChild->aD
2e270 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f  ata[pChild->hdrO
2e280 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2e290 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2e2a0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2e2b0 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2e2c0 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61  CE: child %d tra
2e2d0 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c  nsfer to page 1\
2e2e0 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
2e2f0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2e300 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2e310 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69  child has more i
2e320 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
2e330 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2e340 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a  root..        **
2e350 20 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72   The tree is alr
2e360 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20  eady balanced.  
2e370 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  Do nothing. */. 
2e380 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
2e390 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
2e3a0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
2e3b0 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
2e3c0 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
2e3d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2e3e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
2e3f0 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64  e->aData, pChild
2e400 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  ->aData, pPage->
2e410 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
2e420 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  ;.      pPage->i
2e430 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  sInit = 0;.     
2e440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e450 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
2e460 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2e470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e480 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65  ;.      freePage
2e490 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2e4a0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2e4b0 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20   transfer child 
2e4c0 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c  %d into root %d\
2e4d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2e4e0 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20    pChild->pgno, 
2e4f0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2e500 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2e510 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2e520 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  w==0 );.#ifndef 
2e530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2e540 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 49  VACUUM.    if( I
2e550 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 72  SAUTOVACUUM && r
2e560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e570 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 43 68        rc = setCh
2e580 69 6c 64 50 74 72 6d 61 70 73 28 70 50 61 67 65  ildPtrmaps(pPage
2e590 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2e5a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2e5b0 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64  pChild);.  }.end
2e5c0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
2e5d0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2e5e0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  (apCell);.  retu
2e5f0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2e600 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
2e610 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a  s overfull.**.**
2e620 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65   When this happe
2e630 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77  ns, Create a new
2e640 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20   child page and 
2e650 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  copy the.** cont
2e660 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
2e670 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
2e680 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20    Then make the 
2e690 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20  root.** page an 
2e6a0 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
2e6b0 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74  rightChild point
2e6c0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ing to the new.*
2e6d0 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c  * child.   Final
2e6e0 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ly, call balance
2e6f0 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74  _internal() on t
2e700 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20  he new child.** 
2e710 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73  to cause it to s
2e720 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plit..*/.static 
2e730 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
2e740 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  er(BtCursor *pCu
2e750 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
2e760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2e770 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
2e780 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
2e790 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e7a0 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ;     /* Pointer
2e7b0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
2e7c0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2e7d0 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
2e7e0 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
2e7f0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
2e800 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
2e810 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2e820 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
2e830 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
2e840 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2e850 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
2e860 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
2e870 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
2e880 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
2e890 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
2e8a0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2e8b0 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2e8c0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2e8d0 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
2e8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2e8f0 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
2e900 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
2e910 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
2e920 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
2e930 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
2e940 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  t */.  int cbrk;
2e950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2e960 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
2e970 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
2e980 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
2e990 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2e9a0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
2e9b0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
2e9c0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  ]->nOverflow>0 )
2e9d0 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70  ;..  VVA_ONLY( p
2e9e0 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
2e9f0 65 64 20 3d 20 31 20 29 3b 0a 20 20 70 50 61 67  ed = 1 );.  pPag
2ea00 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2ea10 5b 30 5d 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  [0];.  pBt = pPa
2ea20 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ge->pBt;.  asser
2ea30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2ea40 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2ea50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2ea60 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2ea70 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2ea80 62 50 61 67 65 29 20 29 3b 0a 20 20 72 63 20 3d  bPage) );.  rc =
2ea90 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2eaa0 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c  ge(pBt, &pChild,
2eab0 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61   &pgnoChild, pPa
2eac0 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  ge->pgno, 0);.  
2ead0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2eae0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
2eaf0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2eb00 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
2eb10 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62  bPage) );.  usab
2eb20 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
2eb30 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61  ableSize;.  data
2eb40 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2eb50 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
2eb60 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62 72  hdrOffset;.  cbr
2eb70 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
2eb80 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64  ta[hdr+5]);.  cd
2eb90 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44  ata = pChild->aD
2eba0 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64  ata;.  memcpy(cd
2ebb0 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c  ata, &data[hdr],
2ebc0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2ebd0 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
2ebe0 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79  l-hdr);.  memcpy
2ebf0 28 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  (&cdata[cbrk], &
2ec00 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62  data[cbrk], usab
2ec10 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 0a 20  leSize-cbrk);.. 
2ec20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2ec30 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
2ec40 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ec50 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64  eInitPage(pChild
2ec60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2ec70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
2ec80 74 20 6e 43 6f 70 79 20 3d 20 70 50 61 67 65 2d  t nCopy = pPage-
2ec90 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f  >nOverflow*sizeo
2eca0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2ecb0 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ]);.    memcpy(p
2ecc0 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50  Child->aOvfl, pP
2ecd0 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70  age->aOvfl, nCop
2ece0 79 29 3b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e  y);.    pChild->
2ecf0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67  nOverflow = pPag
2ed00 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  e->nOverflow;.  
2ed10 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f    if( pChild->nO
2ed20 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
2ed30 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d   pChild->nFree =
2ed40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   0;.    }.    as
2ed50 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
2ed60 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ell==pPage->nCel
2ed70 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
2ed80 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ed90 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2eda0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2edb0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2edc0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
2edd0 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
2ede0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2edf0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2ee00 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2ee10 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 54  gnoChild);.    T
2ee20 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2ee30 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
2ee40 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
2ee50 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
2ee60 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 49 53  no));.    if( IS
2ee70 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2ee80 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2ee90 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e  ut(pBt, pChild->
2eea0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
2eeb0 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  EE, pPage->pgno)
2eec0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2eed0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2eee0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2eef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ef00 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
2ef10 64 50 74 72 6d 61 70 73 28 70 43 68 69 6c 64 29  dPtrmaps(pChild)
2ef20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ef30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2ef40 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
2ef50 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  low = 0;.      }
2ef60 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2ef70 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
2ef80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
2ef90 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 20  ur->iPage++;.   
2efa0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
2efb0 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 20 20 70   = pChild;.    p
2efc0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
2efd0 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  0;.    rc = bala
2efe0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72  nce_nonroot(pCur
2eff0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2f000 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2f010 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ld);.  }..  retu
2f020 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f030 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43  The page that pC
2f040 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ur currently poi
2f050 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20  nts to has just 
2f060 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e  been modified in
2f070 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68  .** some way. Th
2f080 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75  is function figu
2f090 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20  res out if this 
2f0a0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61  modification mea
2f0b0 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e  ns the.** tree n
2f0c0 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
2f0d0 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63  ced, and if so c
2f0e0 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72  alls the appropr
2f0f0 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a  iate balancing .
2f100 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  ** routine..** .
2f110 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 73 49  ** Parameter isI
2f120 6e 73 65 72 74 20 69 73 20 74 72 75 65 20 69 66  nsert is true if
2f130 20 61 20 6e 65 77 20 63 65 6c 6c 20 77 61 73 20   a new cell was 
2f140 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 69 6e  just inserted in
2f150 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 2c 20  to the.** page, 
2f160 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2f170 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
2f180 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73  t balance(BtCurs
2f190 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 69 73  or *pCur, int is
2f1a0 49 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72  Insert){.  int r
2f1b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f1c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2f1d0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2f1e0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 0a 20 20  Cur->iPage];..  
2f1f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2f200 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2f210 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2f220 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
2f230 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ge==0 ){.    rc 
2f240 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f250 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2f260 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
2f270 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2f280 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2f290 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2f2a0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 43  alance_deeper(pC
2f2b0 75 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ur);.      asser
2f2c0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2f2d0 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20 20  0]==pPage );.   
2f2e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2f2f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
2f300 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
2f310 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f330 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  & pPage->nCell==
2f340 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2f350 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
2f360 72 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 61  r(pCur);.      a
2f370 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2f380 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b  age[0]==pPage );
2f390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f3a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2f3b0 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  =0 || rc!=SQLITE
2f3c0 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  _OK );.    }.  }
2f3d0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
2f3e0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2f3f0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69   || .        (!i
2f400 73 49 6e 73 65 72 74 20 26 26 20 70 50 61 67 65  sInsert && pPage
2f410 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70  ->nFree>pPage->p
2f420 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2f430 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  /3) ){.      rc 
2f440 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2f450 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2f460 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f470 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2f480 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c  utine checks all
2f490 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f   cursors that po
2f4a0 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e  int to table pgn
2f4b0 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79  oRoot..** If any
2f4c0 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72   of those cursor
2f4d0 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69  s were opened wi
2f4e0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20  th wrFlag==0 in 
2f4f0 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64  a different.** d
2f500 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2f510 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20 63  on (a database c
2f520 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73  onnection that s
2f530 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72 0a  hares the pager.
2f540 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74 68  ** cache with th
2f550 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63  e current connec
2f560 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f  tion) and that o
2f570 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2f580 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  .** is not in th
2f590 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74  e ReadUncommmitt
2f5a0 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ed state, then t
2f5b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2f5c0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  rns .** SQLITE_L
2f5d0 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20  OCKED..**.** As 
2f5e0 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20  well as cursors 
2f5f0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20  with wrFlag==0, 
2f600 63 75 72 73 6f 72 73 20 77 69 74 68 20 0a 2a 2a  cursors with .**
2f610 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
2f620 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f  e==1 are also co
2f630 6e 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20  nsidered 'read' 
2f640 63 75 72 73 6f 72 73 20 62 65 63 61 75 73 65 0a  cursors because.
2f650 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  ** incremental b
2f660 6c 6f 62 20 63 75 72 73 6f 72 73 20 61 72 65 20  lob cursors are 
2f670 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65  used for both re
2f680 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
2f690 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67  g..**.** When pg
2f6a0 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f  noRoot is the ro
2f6b0 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e  ot page of an in
2f6c0 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73  tkey table, this
2f6d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
2f6e0 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65  o.** responsible
2f6f0 20 66 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e   for invalidatin
2f700 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  g incremental bl
2f710 6f 62 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20  ob cursors when 
2f720 74 68 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a  the table row.**
2f730 20 6f 6e 20 77 68 69 63 68 20 74 68 65 79 20 61   on which they a
2f740 72 65 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c  re opened is del
2f750 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64  eted or modified
2f760 2e 20 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e  . Cursors are in
2f770 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63  validated.** acc
2f780 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f  ording to the fo
2f790 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  llowing rules:.*
2f7a0 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42  *.**   1) When B
2f7b0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
2f7c0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
2f7d0 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20  mpletely delete 
2f7e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
2f7f0 20 20 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65       of a B-Tree
2f800 20 74 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65   table, pExclude
2f810 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
2f820 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52  and parameter iR
2f830 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73  ow is .**      s
2f840 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  et to non-zero. 
2f850 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
2f860 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2f870 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a  b cursors open.*
2f880 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61  *      on the ta
2f890 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67  ble rooted at pg
2f8a0 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c  noRoot are inval
2f8b0 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2f8c0 32 29 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73  2) When BtreeIns
2f8d0 65 72 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65  ert(), BtreeDele
2f8e0 74 65 28 29 20 6f 72 20 42 74 72 65 65 50 75 74  te() or BtreePut
2f8f0 44 61 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64  Data() is called
2f900 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64   to .**      mod
2f910 69 66 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20  ify a table row 
2f920 76 69 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65  via an SQL state
2f930 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69  ment, pExclude i
2f940 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2f950 20 20 20 20 20 20 77 72 69 74 65 20 63 75 72 73        write curs
2f960 6f 72 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  or used to do th
2f970 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61  e modification a
2f980 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f  nd parameter iRo
2f990 77 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20  w is set.**     
2f9a0 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20   to the integer 
2f9b0 72 6f 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d  row id of the B-
2f9c0 54 72 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67  Tree entry being
2f9d0 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73   modified. Unles
2f9e0 73 0a 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75  s.**      pExclu
2f9f0 64 65 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20  de is itself an 
2fa00 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2fa10 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c   cursor, then al
2fa20 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  l incremental.**
2fa30 20 20 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f        blob curso
2fa40 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69  rs open on row i
2fa50 52 6f 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65  Row of the B-Tre
2fa60 65 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  e are invalidate
2fa70 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66  d..**.**   3) If
2fa80 20 62 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61   both pExclude a
2fa90 6e 64 20 69 52 6f 77 20 61 72 65 20 73 65 74 20  nd iRow are set 
2faa0 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72  to zero, no incr
2fab0 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a  emental blob .**
2fac0 20 20 20 20 20 20 63 75 72 73 6f 72 73 20 61 72        cursors ar
2fad0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
2fae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
2faf0 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63  ckForReadConflic
2fb00 74 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ts(.  Btree *pBt
2fb10 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
2fb20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2fb30 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
2fb40 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
2fb50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b           /* Look
2fb60 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
2fb70 73 20 6f 6e 20 74 68 69 73 20 62 74 72 65 65 20  s on this btree 
2fb80 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
2fb90 45 78 63 6c 75 64 65 2c 20 20 20 20 20 2f 2a 20  Exclude,     /* 
2fba0 49 67 6e 6f 72 65 20 74 68 69 73 20 63 75 72 73  Ignore this curs
2fbb0 6f 72 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  or */.  i64 iRow
2fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbd0 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68 61  /* The rowid tha
2fbe0 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67  t might be chang
2fbf0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ing */.){.  BtCu
2fc00 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
2fc10 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
2fc20 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  e->pBt;.  sqlite
2fc30 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  3 *db = pBtree->
2fc40 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
2fc50 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2fc60 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
2fc70 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
2fc80 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
2fc90 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d  ext){.    if( p=
2fca0 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
2fcb0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
2fcc0 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52  >pgnoRoot!=pgnoR
2fcd0 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oot ) continue;.
2fce0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2fcf0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
2fd00 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c   if( p->isIncrbl
2fd10 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20  obHandle && ( . 
2fd20 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c 75          (!pExclu
2fd30 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20  de && iRow).    
2fd40 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26    || (pExclude &
2fd50 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49  & !pExclude->isI
2fd60 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
2fd70 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
2fd80 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  Row).    )){.   
2fd90 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
2fda0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2fdb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2fdc0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
2fdd0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
2fde0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2fdf0 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69  p->wrFlag==0 .#i
2fe00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2fe10 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
2fe20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  || p->isIncrblob
2fe30 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20  Handle.#endif.  
2fe40 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
2fe50 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d  e3 *dbOther = p-
2fe60 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
2fe70 20 20 20 61 73 73 65 72 74 28 64 62 4f 74 68 65     assert(dbOthe
2fe80 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  r);.      if( db
2fe90 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62  Other!=db && (db
2fea0 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53  Other->flags & S
2feb0 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2fec0 69 74 74 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20  itted)==0 ){.   
2fed0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
2fee0 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 64 62  ectionBlocked(db
2fef0 2c 20 64 62 4f 74 68 65 72 29 3b 0a 20 20 20 20  , dbOther);.    
2ff00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ff10 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2ff20 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ACHE;.      }.  
2ff30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2ff40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2ff50 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
2ff60 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
2ff70 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
2ff80 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
2ff90 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
2ffa0 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
2ffb0 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
2ffc0 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
2ffd0 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
2ffe0 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
2fff0 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
30000 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
30010 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
30020 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
30030 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
30040 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
30050 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
30060 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
30070 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
30080 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
30090 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
300a0 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
300b0 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
300c0 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
300d0 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
300e0 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
300f0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
30100 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
30110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30120 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
30130 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
30140 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
30150 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
30160 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
30170 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
30180 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
30190 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
301a0 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
301b0 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
301c0 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
301d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
301e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30200 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
30210 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
30220 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
30230 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20  dBias           
30240 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
30250 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
30260 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a  an append */.){.
30270 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
30280 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77  loc;.  int szNew
30290 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
302a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
302b0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
302c0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
302d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
302e0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
302f0 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20  har *oldCell;.  
30300 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e  unsigned char *n
30310 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61  ewCell = 0;..  a
30320 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
30330 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
30340 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
30350 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
30360 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
30370 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
30380 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
30390 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
303a0 20 29 3b 0a 20 20 72 63 20 3d 20 63 68 65 63 6b   );.  rc = check
303b0 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  ForReadConflicts
303c0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70  (pCur->pBtree, p
303d0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
303e0 43 75 72 2c 20 6e 4b 65 79 29 3b 0a 20 20 69 66  Cur, nKey);.  if
303f0 28 20 72 63 20 29 7b 20 20 20 20 20 20 20 20 20  ( rc ){         
30400 20 20 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20      .    /* The 
30410 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
30420 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
30430 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73 65  lock */.    asse
30440 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c  rt( rc==SQLITE_L
30450 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
30460 45 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E );.    return 
30470 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
30480 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
30490 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
304a0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
304b0 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  p;.  }..  /* Sav
304c0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
304d0 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
304e0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
304f0 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  s table */.  sql
30500 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
30510 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 69 66  rsor(pCur);.  if
30520 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
30530 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
30540 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
30550 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
30560 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
30570 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
30580 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
30590 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
305a0 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
305b0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
305c0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50  rn rc;.  }..  pP
305d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
305e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
305f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30600 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
30610 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
30620 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
30630 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
30640 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45  ;.  TRACE(("INSE
30650 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65  RT: table=%d nke
30660 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20  y=%lld ndata=%d 
30670 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  page=%d %s\n",. 
30680 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
30690 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e  gnoRoot, nKey, n
306a0 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Data, pPage->pgn
306b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63  o,.          loc
306c0 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65  ==0 ? "overwrite
306d0 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29  " : "new entry")
306e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
306f0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
30700 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
30710 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c  e(pBt);.  newCel
30720 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  l = pBt->pTmpSpa
30730 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c  ce;.  if( newCel
30740 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
30750 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
30760 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
30770 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b  age, newCell, pK
30780 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c  ey, nKey, pData,
30790 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26   nData, nZero, &
307a0 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63  szNew);.  if( rc
307b0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
307c0 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  rt;.  assert( sz
307d0 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  New==cellSizePtr
307e0 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29  (pPage, newCell)
307f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
30800 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a  New<=MX_CELL_SIZ
30810 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20  E(pBt) );.  idx 
30820 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
30830 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66  ur->iPage];.  if
30840 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53  ( loc==0 && CURS
30850 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
30860 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 75 31  eState ){.    u1
30870 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73  6 szOld;.    ass
30880 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e  ert( idx<pPage->
30890 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
308a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
308b0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
308c0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
308d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
308e0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a  d_insert;.    }.
308f0 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69      oldCell = fi
30900 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
30910 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
30920 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30930 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
30940 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
30950 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
30960 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
30970 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
30980 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
30990 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
309a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
309b0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
309c0 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c      rc = dropCel
309d0 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a  l(pPage, idx, sz
309e0 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Old);.    if( rc
309f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  !=SQLITE_OK ) {.
30a00 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
30a10 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  nsert;.    }.  }
30a20 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26  else if( loc<0 &
30a30 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  & pPage->nCell>0
30a40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
30a50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
30a60 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d     idx = ++pCur-
30a70 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
30a80 67 65 5d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  ge];.    pCur->i
30a90 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
30aa0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
30ab0 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
30ac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
30ad0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a  ge->leaf );.  }.
30ae0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
30af0 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65  l(pPage, idx, ne
30b00 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
30b10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
30b20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30b30 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
30b40 72 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r, 1);.  }..  /*
30b50 20 4d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   Must make sure 
30b60 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73  nOverflow is res
30b70 65 74 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20  et to zero even 
30b80 69 66 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  if the balance()
30b90 0a 20 20 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e  .  ** fails.  In
30ba0 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
30bb0 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
30bc0 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68   will result oth
30bd0 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 70 43 75  erwise. */.  pCu
30be0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
30bf0 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
30c00 77 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 63  w = 0;..  if( rc
30c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30c20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
30c30 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73  ur);.  }.end_ins
30c40 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ert:.  return rc
30c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
30c60 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
30c70 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
30c80 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
30c90 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
30ca0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
30cb0 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74   arbitrary locat
30cc0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
30cd0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42  te3BtreeDelete(B
30ce0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
30cf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
30d00 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
30d10 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
30d20 69 6e 74 20 69 64 78 3b 0a 20 20 75 6e 73 69 67  int idx;.  unsig
30d30 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
30d40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
30d50 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
30d60 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
30d70 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
30d80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
30d90 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
30da0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
30db0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
30dc0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
30dd0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
30de0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
30df0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
30e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
30e10 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
30e20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
30e30 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
30e40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
30e50 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20  ur->skip;.  }.  
30e60 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
30e70 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
30e80 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
30e90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
30ea0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
30eb0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  * The cursor is 
30ec0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
30ed0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
30ee0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
30ef0 77 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d  wrFlag );.  rc =
30f00 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e   checkForReadCon
30f10 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d 3e  flicts(p, pCur->
30f20 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20  pgnoRoot, pCur, 
30f30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
30f40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
30f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
30f60 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
30f70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
30f80 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
30f90 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
30fa0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
30fb0 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74  CACHE );.    ret
30fc0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
30fd0 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
30fe0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
30ff0 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69  ition (a no-op i
31000 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
31010 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52  not in .  ** CUR
31020 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
31030 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65 20  state) and save 
31040 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
31050 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
31060 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e  rs .  ** open on
31070 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
31080 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   Then call sqlit
31090 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
310a0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
310b0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 77  that the entry w
310c0 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66  ill be deleted f
310d0 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rom..  */.  if( 
310e0 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f  .    (rc = resto
310f0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
31100 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20  (pCur))!=0 ||.  
31110 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43    (rc = saveAllC
31120 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
31130 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
31140 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63  ))!=0 ||.    (rc
31150 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31160 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
31170 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20  age))!=0.  ){.  
31180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
31190 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
311a0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74  e cell within it
311b0 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65  s page and leave
311c0 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   pCell pointing 
311d0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
311e0 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28  . The clearCell(
311f0 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79  ) call frees any
31200 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
31210 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
31220 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54  the.  ** cell. T
31230 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69  he cell itself i
31240 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a  s still intact..
31250 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75    */.  idx = pCu
31260 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
31270 50 61 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d  Page];.  pCell =
31280 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
31290 20 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50   idx);.  if( !pP
312a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
312b0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
312c0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
312d0 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  }.  rc = clearCe
312e0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
312f0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
31300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
31310 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
31320 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  leaf ){.    /*. 
31330 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20     ** The entry 
31340 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
31350 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20  delete is not a 
31360 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f  leaf so if we do
31370 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73   not.    ** do s
31380 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c  omething we will
31390 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e   leave a hole on
313a0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67   an internal pag
313b0 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76  e..    ** We hav
313c0 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f  e to fill the ho
313d0 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20  le by moving in 
313e0 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  a cell from a le
313f0 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  af.  The.    ** 
31400 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20  next Cell after 
31410 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65  the one to be de
31420 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e 74  leted is guarant
31430 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64  eed to exist and
31440 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20  .    ** to be a 
31450 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75  leaf so we can u
31460 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  se it..    */.  
31470 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43    BtCursor leafC
31480 75 72 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  ur;.    MemPage 
31490 2a 70 4c 65 61 66 50 61 67 65 20 3d 20 30 3b 0a  *pLeafPage = 0;.
314a0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
314b0 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69  ar *pNext;.    i
314c0 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
314d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
314e0 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  empCell = 0;.   
314f0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d   assert( !pPage-
31500 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 73  >intKey );.    s
31510 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
31520 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26  mpCursor(pCur, &
31530 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63  leafCur);.    rc
31540 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
31550 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e  ext(&leafCur, &n
31560 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
31570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31580 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
31590 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65  leafCur.aiIdx[le
315a0 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20  afCur.iPage]==0 
315b0 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 50 61  );.      pLeafPa
315c0 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70 50  ge = leafCur.apP
315d0 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61 67  age[leafCur.iPag
315e0 65 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e];.      rc = s
315f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31600 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50  (pLeafPage->pDbP
31610 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
31620 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31630 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  K ){.      int l
31640 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64  eafCursorInvalid
31650 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 31 36 20   = 0;.      u16 
31660 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20 54 52  szNext;.      TR
31670 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
31680 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e  ble=%d delete in
31690 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72  ternal from %d r
316a0 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66  eplace from leaf
316b0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
316c0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
316d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c   pPage->pgno, pL
316e0 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  eafPage->pgno));
316f0 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
31700 70 50 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c  pPage, idx, cell
31710 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
31720 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e  Cell));.      pN
31730 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ext = findCell(p
31740 4c 65 61 66 50 61 67 65 2c 20 30 29 3b 0a 20 20  LeafPage, 0);.  
31750 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c      szNext = cel
31760 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66 50 61  lSizePtr(pLeafPa
31770 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20  ge, pNext);.    
31780 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
31790 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e  L_SIZE(pBt)>=szN
317a0 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61  ext+4 );.      a
317b0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
317c0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d  (pBt);.      tem
317d0 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d  pCell = pBt->pTm
317e0 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66  pSpace;.      if
317f0 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b  ( tempCell==0 ){
31800 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31810 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
31820 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
31830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31840 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65         rc = inse
31850 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
31860 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65  x, pNext-4, szNe
31870 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20  xt+4, tempCell, 
31880 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20  0);.      }...  
31890 20 20 20 20 2f 2a 20 54 68 65 20 22 69 66 22 20      /* The "if" 
318a0 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
318b0 20 6e 65 78 74 20 63 6f 64 65 20 62 6c 6f 63 6b   next code block
318c0 20 69 73 20 63 72 69 74 69 63 61 6c 2e 20 20 54   is critical.  T
318d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 6c 69 67  he.      ** slig
318e0 68 74 65 73 74 20 65 72 72 6f 72 20 69 6e 20 74  htest error in t
318f0 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 77 6f  hat statement wo
31900 75 6c 64 20 61 6c 6c 6f 77 20 53 51 4c 69 74 65  uld allow SQLite
31910 20 74 6f 20 6f 70 65 72 61 74 65 0a 20 20 20 20   to operate.    
31920 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 6d    ** correctly m
31930 6f 73 74 20 6f 66 20 74 68 65 20 74 69 6d 65 20  ost of the time 
31940 62 75 74 20 70 72 6f 64 75 63 65 20 76 65 72 79  but produce very
31950 20 72 61 72 65 20 66 61 69 6c 75 72 65 73 2e 20   rare failures. 
31960 20 54 6f 0a 20 20 20 20 20 20 2a 2a 20 67 75 61   To.      ** gua
31970 72 64 20 61 67 61 69 6e 73 74 20 74 68 69 73 2c  rd against this,
31980 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
31990 61 63 72 6f 73 20 68 65 6c 70 20 74 6f 20 76 65  acros help to ve
319a0 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 20 20  rify that.      
319b0 2a 2a 20 74 68 65 20 22 69 66 22 20 73 74 61 74  ** the "if" stat
319c0 65 6d 65 6e 74 20 69 73 20 77 65 6c 6c 20 74 65  ement is well te
319d0 73 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  sted..      */. 
319e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
319f0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
31a00 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  =0 && pPage->nFr
31a10 65 65 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ee<pBt->usableSi
31a20 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20 20 20  ze*2/3 .        
31a30 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61           && pLea
31a40 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
31a50 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61  zNext > pBt->usa
31a60 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20  bleSize*2/3 );. 
31a70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
31a80 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
31a90 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72  =0 && pPage->nFr
31aa0 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ee==pBt->usableS
31ab0 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20 20  ize*2/3 .       
31ac0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
31ad0 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
31ae0 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
31af0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
31b00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31b10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
31b20 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
31b30 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ree==pBt->usable
31b40 53 69 7a 65 2a 32 2f 33 2b 31 20 0a 20 20 20 20  Size*2/3+1 .    
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
31b60 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
31b70 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d  +2+szNext > pBt-
31b80 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
31b90 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
31ba0 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  e( pPage->nOverf
31bb0 6c 6f 77 3e 30 20 26 26 20 70 50 61 67 65 2d 3e  low>0 && pPage->
31bc0 6e 46 72 65 65 3c 3d 70 42 74 2d 3e 75 73 61 62  nFree<=pBt->usab
31bd0 6c 65 53 69 7a 65 2a 32 2f 33 0a 20 20 20 20 20  leSize*2/3.     
31be0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
31bf0 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
31c00 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e  2+szNext > pBt->
31c10 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29  usableSize*2/3 )
31c20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
31c30 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ( (pPage->nOverf
31c40 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67 65 2d  low>0 || (pPage-
31c50 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e 75 73  >nFree > pBt->us
31c60 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29 0a 20  ableSize*2/3)). 
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46  && pLeafPage->nF
31c90 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d 20  ree+2+szNext == 
31ca0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
31cb0 32 2f 33 20 29 3b 0a 0a 0a 20 20 20 20 20 20 69  2/3 );...      i
31cc0 66 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72  f( (pPage->nOver
31cd0 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67 65  flow>0 || (pPage
31ce0 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e 75  ->nFree > pBt->u
31cf0 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29 20  sableSize*2/3)) 
31d00 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 70 4c  &&.          (pL
31d10 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
31d20 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75  +szNext > pBt->u
31d30 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 0a 20  sableSize*2/3). 
31d40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
31d50 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
31d60 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 69  s taken if the i
31d70 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20  nternal node is 
31d80 6e 6f 77 20 65 69 74 68 65 72 20 6f 76 65 72 66  now either overf
31d90 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  lowing.        *
31da0 2a 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20 61  * or underfull a
31db0 6e 64 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  nd the leaf node
31dc0 20 77 69 6c 6c 20 62 65 20 75 6e 64 65 72 66 75   will be underfu
31dd0 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6a 75 73  ll after the jus
31de0 74 20 63 65 6c 6c 20 0a 20 20 20 20 20 20 20 20  t cell .        
31df0 2a 2a 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  ** copied to the
31e00 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69   internal node i
31e10 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 69  s deleted from i
31e20 74 2e 20 54 68 69 73 20 69 73 20 61 20 73 70 65  t. This is a spe
31e30 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  cial.        ** 
31e40 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65  case because the
31e50 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
31e60 28 29 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68  () to correct th
31e70 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 0a  e internal node.
31e80 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 63          ** may c
31e90 68 61 6e 67 65 20 74 68 65 20 74 72 65 65 20 73  hange the tree s
31ea0 74 72 75 63 74 75 72 65 20 61 6e 64 20 69 6e 76  tructure and inv
31eb0 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74  alidate the cont
31ec0 65 6e 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ents of.        
31ed0 2a 2a 20 74 68 65 20 6c 65 61 66 43 75 72 2e 61  ** the leafCur.a
31ee0 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66  pPage[] and leaf
31ef0 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61  Cur.aiIdx[] arra
31f00 79 73 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62  ys, which will b
31f10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  e.        ** use
31f20 64 20 62 79 20 74 68 65 20 62 61 6c 61 6e 63 65  d by the balance
31f30 28 29 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  () required to c
31f40 6f 72 72 65 63 74 20 74 68 65 20 75 6e 64 65 72  orrect the under
31f50 66 75 6c 6c 20 6c 65 61 66 0a 20 20 20 20 20 20  full leaf.      
31f60 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20 20 20 20    ** node..     
31f70 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31f80 20 54 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   The formula use
31f90 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
31fa0 69 6f 6e 20 61 62 6f 76 65 20 61 72 65 20 62 61  ion above are ba
31fb0 73 65 64 20 6f 6e 20 66 61 63 65 74 73 20 6f 66  sed on facets of
31fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
31fd0 53 51 4c 69 74 65 20 66 69 6c 65 2d 66 6f 72 6d  SQLite file-form
31fe0 61 74 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  at that do not c
31ff0 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d 65 2e  hange over time.
32000 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
32010 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
32020 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d  age->nFree==pBt-
32030 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b  >usableSize*2/3+
32040 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
32050 74 63 61 73 65 28 20 70 4c 65 61 66 50 61 67 65  tcase( pLeafPage
32060 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
32070 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ==pBt->usableSiz
32080 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20  e*2/3+1 );.     
32090 20 20 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76     leafCursorInv
320a0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
320b0 7d 20 20 20 20 20 20 20 20 0a 0a 20 20 20 20 20  }        ..     
320c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
320d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
320e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
320f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
32100 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
32110 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
32120 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
32130 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 2c 20  ll(pPage, idx), 
32140 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20  pgnoChild);.    
32150 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43      VVA_ONLY( pC
32160 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65  ur->pagesShuffle
32170 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20  d = 0 );.       
32180 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43   rc = balance(pC
32190 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ur, 0);.      }.
321a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
321b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66  QLITE_OK && leaf
321c0 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b  CursorInvalid ){
321d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
321e0 6c 65 61 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77  leaf-node is now
321f0 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 73   underfull and s
32200 6f 20 74 68 65 20 74 72 65 65 20 6e 65 65 64 73  o the tree needs
32210 20 74 6f 20 62 65 20 0a 20 20 20 20 20 20 20 20   to be .        
32220 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 48  ** rebalanced. H
32230 6f 77 65 76 65 72 2c 20 74 68 65 20 62 61 6c 61  owever, the bala
32240 6e 63 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20  nce() operation 
32250 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  on the internal.
32260 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20          ** node 
32270 61 62 6f 76 65 20 6d 61 79 20 68 61 76 65 20 6d  above may have m
32280 6f 64 69 66 69 65 64 20 74 68 65 20 73 74 72 75  odified the stru
32290 63 74 75 72 65 20 6f 66 20 74 68 65 20 42 2d 54  cture of the B-T
322a0 72 65 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ree and.        
322b0 2a 2a 20 73 6f 20 74 68 65 20 63 75 72 72 65 6e  ** so the curren
322c0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65  t contents of le
322d0 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61  afCur.apPage[] a
322e0 6e 64 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  nd leafCur.aiIdx
322f0 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  [].        ** ma
32300 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  y not be trusted
32310 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
32320 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f       ** It is no
32330 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f  t possible to co
32340 70 79 20 74 68 65 20 61 6e 63 65 73 74 72 79 20  py the ancestry 
32350 66 72 6f 6d 20 70 43 75 72 2c 20 61 73 20 74 68  from pCur, as th
32360 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a  e same.        *
32370 2a 20 62 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c  * balance() call
32380 20 68 61 73 20 69 6e 76 61 6c 69 64 61 74 65 64   has invalidated
32390 20 74 68 65 20 70 43 75 72 2d 3e 61 70 50 61 67   the pCur->apPag
323a0 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a  e[] and aiIdx[].
323b0 20 20 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79          ** array
323c0 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  s. .        **. 
323d0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 61         ** The ca
323e0 6c 6c 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ll to saveCursor
323f0 50 6f 73 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77  Position() below
32400 20 69 6e 74 65 72 6e 61 6c 6c 79 20 73 61 76 65   internally save
32410 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  s the .        *
32420 2a 20 6b 65 79 20 74 68 61 74 20 6c 65 61 66 43  * key that leafC
32430 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ur is currently 
32440 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72  pointing to. Cur
32450 72 65 6e 74 6c 79 2c 20 74 68 65 72 65 0a 20 20  rently, there.  
32460 20 20 20 20 20 20 2a 2a 20 61 72 65 20 74 77 6f        ** are two
32470 20 63 6f 70 69 65 73 20 6f 66 20 74 68 61 74 20   copies of that 
32480 6b 65 79 20 69 6e 20 74 68 65 20 74 72 65 65 20  key in the tree 
32490 2d 20 6f 6e 65 20 68 65 72 65 20 6f 6e 20 74 68  - one here on th
324a0 65 20 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a  e leaf.        *
324b0 2a 20 70 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f  * page and one o
324c0 6e 20 73 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20  n some internal 
324d0 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72 65 65  node in the tree
324e0 2e 20 54 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20  . The copy on.  
324f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61        ** the lea
32500 66 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  f node is always
32510 20 74 68 65 20 6e 65 78 74 20 6b 65 79 20 69 6e   the next key in
32520 20 74 72 65 65 2d 6f 72 64 65 72 20 61 66 74 65   tree-order afte
32530 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
32540 2a 20 63 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e  * copy on the in
32550 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c  ternal node. So,
32560 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
32570 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 0a  ite3BtreeNext().
32580 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73          ** calls
32590 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
325a0 73 69 74 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e  sition() to poin
325b0 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  t the cursor to 
325c0 74 68 65 20 63 6f 70 79 0a 20 20 20 20 20 20 20  the copy.       
325d0 20 2a 2a 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   ** stored on th
325e0 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c  e internal node,
325f0 20 74 68 65 6e 20 61 64 76 61 6e 63 65 73 20 74   then advances t
32600 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
32610 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69  ,.        ** whi
32620 63 68 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ch happens to be
32630 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65   the copy of the
32640 20 6b 65 79 20 6f 6e 20 74 68 65 20 69 6e 74 65   key on the inte
32650 72 6e 61 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20  rnal node..     
32660 20 20 20 2a 2a 20 4e 65 74 20 65 66 66 65 63 74     ** Net effect
32670 3a 20 6c 65 61 66 43 75 72 20 69 73 20 70 6f 69  : leafCur is poi
32680 6e 74 69 6e 67 20 62 61 63 6b 20 74 6f 20 74 68  nting back to th
32690 65 20 64 75 70 6c 69 63 61 74 65 20 63 65 6c 6c  e duplicate cell
326a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
326b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
326c0 6f 76 65 64 2c 20 61 6e 64 20 74 68 65 20 6c 65  oved, and the le
326d0 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61  afCur.apPage[] a
326e0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65  nd.        ** le
326f0 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72  afCur.aiIdx[] ar
32700 72 61 79 73 20 61 72 65 20 63 6f 72 72 65 63 74  rays are correct
32710 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32720 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50       VVA_ONLY( P
32730 67 6e 6f 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70  gno leafPgno = p
32740 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29  LeafPage->pgno )
32750 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
32760 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
32770 6e 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20  n(&leafCur);.   
32780 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
327a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
327b0 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43  BtreeNext(&leafC
327c0 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ur, &notUsed);. 
327d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
327e0 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61   pLeafPage = lea
327f0 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66  fCur.apPage[leaf
32800 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20  Cur.iPage];.    
32810 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 61      assert( pLea
32820 66 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61  fPage->pgno==lea
32830 66 50 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20  fPgno );.       
32840 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75 72   assert( leafCur
32850 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69  .aiIdx[leafCur.i
32860 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  Page]==0 );.    
32870 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53    }..      if( S
32880 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20  QLITE_OK==rc.   
32890 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
328a0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ==(rc = sqlite3P
328b0 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50  agerWrite(pLeafP
328c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a  age->pDbPage)) .
328d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
328e0 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50   dropCell(pLeafP
328f0 61 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b  age, 0, szNext);
32900 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  .        VVA_ONL
32910 59 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73  Y( leafCur.pages
32920 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a  Shuffled = 0 );.
32930 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
32940 61 6e 63 65 28 26 6c 65 61 66 43 75 72 2c 20 30  ance(&leafCur, 0
32950 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
32960 74 28 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76  t( leafCursorInv
32970 61 6c 69 64 20 7c 7c 20 21 6c 65 61 66 43 75 72  alid || !leafCur
32980 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 0a 20  .pagesShuffled. 
32990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329b0 20 20 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67 65    || !pCur->page
329c0 73 53 68 75 66 66 6c 65 64 20 29 3b 0a 20 20 20  sShuffled );.   
329d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
329e0 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
329f0 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65  seTempCursor(&le
32a00 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  afCur);.  }else{
32a10 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c  .    TRACE(("DEL
32a20 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65  ETE: table=%d de
32a30 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lete from leaf %
32a40 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75  d\n",.       pCu
32a50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
32a60 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
32a70 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
32a80 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69  age, idx, cellSi
32a90 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
32aa0 6c 6c 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ll));.    if( rc
32ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32ac0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
32ad0 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  e(pCur, 0);.    
32ae0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
32af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32b00 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
32b10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
32b20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
32b30 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
32b40 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
32b50 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
32b60 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
32b70 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
32b80 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
32b90 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
32ba0 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
32bb0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
32bc0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
32bd0 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
32be0 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
32bf0 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
32c00 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
32c10 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
32c20 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
32c30 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
32c40 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
32c50 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
32c60 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
32c70 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
32c80 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
32c90 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
32cb0 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
32cc0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
32cd0 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
32ce0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
32cf0 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
32d00 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
32d10 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
32d20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
32d30 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
32d40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
32d50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
32d60 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
32d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
32d80 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
32d90 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
32da0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
32db0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69  >readOnly );..#i
32dc0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
32dd0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 63  _AUTOVACUUM.  rc
32de0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
32df0 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
32e00 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
32e10 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
32e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
32e30 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 70   }.#else.  if( p
32e40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
32e50 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d  {.    Pgno pgnoM
32e60 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76  ove;      /* Mov
32e70 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74 6f  e a page here to
32e80 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
32e90 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a  he root-page */.
32ea0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
32eb0 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70  geMove; /* The p
32ec0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20  age to move to. 
32ed0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  */..    /* Creat
32ee0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
32ef0 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65 71  may probably req
32f00 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65  uire moving an e
32f10 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
32f20 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20  .    ** to make 
32f30 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77  room for the new
32f40 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61 67   tables root pag
32f50 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73 20  e. In case this 
32f60 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20 2a  page turns.    *
32f70 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20 6f  * out to be an o
32f80 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64 65  verflow page, de
32f90 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f  lete all overflo
32fa0 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68 65  w page-map cache
32fb0 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79  s.    ** held by
32fc0 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20   open cursors.. 
32fd0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69     */.    invali
32fe0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
32ff0 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20 20  ache(pBt);..    
33000 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c 75  /* Read the valu
33010 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f  e of meta[3] fro
33020 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  m the database t
33030 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 72  o determine wher
33040 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f  e the.    ** roo
33050 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
33060 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 67  w table should g
33070 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74 68  o. meta[3] is th
33080 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
33090 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  age.    ** creat
330a0 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74 68  ed so far, so th
330b0 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
330c0 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a  is (meta[3]+1)..
330d0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
330e0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
330f0 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52  eta(p, 4, &pgnoR
33100 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
33110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33120 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33130 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f      }.    pgnoRo
33140 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ot++;..    /* Th
33150 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
33160 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63  may not be alloc
33170 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65  ated on a pointe
33180 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74  r-map page, or t
33190 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  he.    ** PENDIN
331a0 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20  G_BYTE page..   
331b0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
331c0 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f  gnoRoot==PTRMAP_
331d0 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f  PAGENO(pBt, pgno
331e0 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  Root) ||.       
331f0 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49   pgnoRoot==PENDI
33200 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33210 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52  ) ){.      pgnoR
33220 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  oot++;.    }.   
33230 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f   assert( pgnoRoo
33240 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  t>=3 );..    /* 
33250 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e  Allocate a page.
33260 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
33270 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73  urrently resides
33280 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c   at pgnoRoot wil
33290 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65  l.    ** be move
332a0 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  d to the allocat
332b0 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20  ed page (unless 
332c0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
332d0 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a  ge happens.    *
332e0 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70  * to reside at p
332f0 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f  gnoRoot)..    */
33300 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
33310 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
33320 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67   &pPageMove, &pg
33330 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74  noMove, pgnoRoot
33340 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
33350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33360 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33370 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
33380 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f  gnoMove!=pgnoRoo
33390 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67  t ){.      /* pg
333a0 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61  noRoot is the pa
333b0 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ge that will be 
333c0 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  used for the roo
333d0 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20  t-page of.      
333e0 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
333f0 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72   (assuming an er
33400 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75  ror did not occu
33410 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a  r). But we were.
33420 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
33430 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20  ed pgnoMove. If 
33440 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69  required (i.e. i
33450 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c  f it was not all
33460 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ocated.      ** 
33470 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65  by extending the
33480 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72   file), the curr
33490 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73 69  ent page at posi
334a0 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20  tion pgnoMove.  
334b0 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
334c0 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20  y journaled..   
334d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65     */.      u8 e
334e0 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Type;.      Pgno
334f0 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
33500 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
33510 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20  ageMove);..     
33520 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67   /* Move the pag
33530 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70  e currently at p
33540 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d  gnoRoot to pgnoM
33550 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ove. */.      rc
33560 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
33570 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
33580 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
33590 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
335a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
335b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
335c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
335d0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
335e0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79  , pgnoRoot, &eTy
335f0 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
33600 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33610 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65  LITE_OK || eType
33620 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
33630 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
33640 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
33650 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
33660 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
33670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33680 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
33690 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
336a0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
336b0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
336c0 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e!=PTRMAP_FREEPA
336d0 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  GE );.      rc =
336e0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
336f0 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c  t, pRoot, eType,
33700 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d   iPtrPage, pgnoM
33710 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ove, 0);.      r
33720 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
33730 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
33740 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
33750 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
33760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
33780 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
33790 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
337a0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
337b0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
337c0 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
337d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
337e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
337f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
33800 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
33810 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33820 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
33830 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33850 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
33860 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
33870 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
33880 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
33890 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
338a0 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
338b0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
338c0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
338d0 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
338e0 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
338f0 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
33900 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
33910 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
33920 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
33930 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
33940 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
33950 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
33960 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33970 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
33980 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
33990 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
339a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
339b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
339c0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
339d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
339e0 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
339f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
33a00 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
33a10 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
33a20 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
33a30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33a40 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
33a50 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
33a60 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
33a70 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
33a80 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
33a90 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
33aa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
33ab0 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
33ac0 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
33ad0 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
33ae0 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
33af0 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
33b00 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
33b10 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
33b20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
33b30 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
33b40 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
33b50 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
33b60 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
33b70 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72  ;.  rc = btreeCr
33b80 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54  eateTable(p, piT
33b90 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  able, flags);.  
33ba0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
33bb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
33bc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  c;.}../*.** Eras
33bd0 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  e the given data
33be0 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c  base page and al
33bf0 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20  l its children. 
33c00 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70   Return.** the p
33c10 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
33c20 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
33c30 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65  nt clearDatabase
33c40 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
33c50 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
33c60 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68   /* The BTree th
33c70 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
33c80 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  table */.  Pgno 
33c90 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
33ca0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
33cb0 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e  to clear */.  in
33cc0 74 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20  t freePageFlag, 
33cd0 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
33ce0 65 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a  e page if true *
33cf0 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67  /.  int *pnChang
33d00 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e.){.  MemPage *
33d10 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
33d20 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
33d30 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69  char *pCell;.  i
33d40 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
33d50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
33d60 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
33d70 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61  );.  if( pgno>pa
33d80 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
33d90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
33da0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33db0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  KPT;.  }..  rc =
33dc0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
33dd0 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67  pBt, pgno, &pPag
33de0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
33df0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
33e00 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
33e10 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
33e20 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
33e30 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
33e40 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
33e50 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
33e60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
33e70 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
33e80 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
33e90 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e  Cell), 1, pnChan
33ea0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
33eb0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
33ec0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
33ed0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
33ee0 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
33ef0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
33f00 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
33f10 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
33f20 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
33f30 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
33f40 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
33f50 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
33f60 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
33f70 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e  a[8]), 1, pnChan
33f80 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
33f90 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
33fa0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
33fb0 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e  }else if( pnChan
33fc0 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
33fd0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
33fe0 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65  );.    *pnChange
33ff0 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   += pPage->nCell
34000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
34010 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
34020 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
34030 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  age);.  }else if
34040 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
34050 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
34060 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b  >pDbPage))==0 ){
34070 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
34080 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
34090 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
340a0 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
340b0 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
340c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
340d0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
340e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
340f0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
34100 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
34110 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
34120 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
34130 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
34140 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
34150 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
34160 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
34170 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
34180 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
34190 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
341a0 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
341b0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
341c0 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
341d0 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
341e0 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
341f0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
34200 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
34210 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
34220 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
34230 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
34240 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
34250 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20  pnChange is not 
34260 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65  NULL, then table
34270 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20   iTable must be 
34280 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e  an intkey table.
34290 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   The.** integer 
342a0 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f  value pointed to
342b0 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20   by pnChange is 
342c0 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74  incremented by t
342d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
342e0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74  entries in the t
342f0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
34300 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
34310 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
34320 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
34330 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20  nChange){.  int 
34340 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
34350 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
34360 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
34370 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
34380 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
34390 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
343a0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
343b0 69 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b 46  if( (rc = checkF
343c0 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  orReadConflicts(
343d0 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29  p, iTable, 0, 1)
343e0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
343f0 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
34400 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  o do */.  }else 
34410 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
34420 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
34430 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c  ors(pBt, iTable,
34440 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e   0)) ){.    /* n
34450 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
34460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
34470 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
34480 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
34490 54 61 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e  Table, 0, pnChan
344a0 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ge);.  }.  sqlit
344b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
344c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
344d0 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
344e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
344f0 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20  a table and add 
34500 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
34510 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20  table to.** the 
34520 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70  freelist.  Excep
34530 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  t, the root of t
34540 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62  he principle tab
34550 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a  le (the one on.*
34560 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76  * page 1) is nev
34570 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  er added to the 
34580 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
34590 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
345a0 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
345b0 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
345c0 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
345d0 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ** cursors on th
345e0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
345f0 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
34600 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  enabled and the 
34610 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69  page at iTable i
34620 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a  s not the last.*
34630 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  * root page in t
34640 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34650 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
34660 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e  root page .** in
34670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34680 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f  le is moved into
34690 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72   the slot former
346a0 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a  ly occupied by.*
346b0 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61  * iTable and tha
346c0 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d  t last slot form
346d0 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
346e0 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
346f0 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  age.** is added 
34700 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
34710 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c  instead of iTabl
34720 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c  e.  In this say,
34730 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   all.** root pag
34740 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74  es are kept at t
34750 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
34760 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34770 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e  e, which.** is n
34780 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54  ecessary for AUT
34790 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20  OVACUUM to work 
347a0 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64  right.  *piMoved
347b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a   is set to the .
347c0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ** page number t
347d0 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74  hat used to be t
347e0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
347f0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65  e in the file be
34800 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65  fore.** the move
34810 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65  .  If no page ge
34820 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76  ts moved, *piMov
34830 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ed is set to 0..
34840 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74  ** The last root
34850 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65   page is recorde
34860 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64  d in meta[3] and
34870 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
34880 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61   meta[3] is upda
34890 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ted by this proc
348a0 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  edure..*/.static
348b0 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61   int btreeDropTa
348c0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ble(Btree *p, Pg
348d0 6e 6f 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  no iTable, int *
348e0 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
348f0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
34900 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68  Page = 0;.  BtSh
34910 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
34920 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Bt;..  assert( s
34930 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
34940 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
34950 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
34960 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
34970 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
34980 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74  egal to drop a t
34990 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73  able if any curs
349a0 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  ors are open on 
349b0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
349c0 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  e. This is becau
349d0 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  se in auto-vacuu
349e0 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65  m mode the backe
349f0 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64  nd may.  ** need
34a00 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72   to move another
34a10 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69   root-page to fi
34a20 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62 79  ll a gap left by
34a30 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a   the deleted.  *
34a40 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20  * root page. If 
34a50 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77  an open cursor w
34a60 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70 61  as using this pa
34a70 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75  ge a problem wou
34a80 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a  ld .  ** occur..
34a90 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
34aa0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
34ab0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
34ac0 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
34ad0 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70 42 74  Bt->pCursor->pBt
34ae0 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65  ree->db);.    re
34af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
34b00 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
34b10 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
34b20 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
34b30 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
34b40 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  e, &pPage, 0);. 
34b50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
34b60 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
34b70 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
34b80 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29  le(p, iTable, 0)
34b90 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
34ba0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
34bb0 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
34bc0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d   rc;.  }..  *piM
34bd0 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  oved = 0;..  if(
34be0 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66   iTable>1 ){.#if
34bf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34c00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72  AUTOVACUUM.    r
34c10 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
34c20 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ge);.    release
34c30 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c  Page(pPage);.#el
34c40 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  se.    if( pBt->
34c50 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
34c60 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74      Pgno maxRoot
34c70 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pgno;.      rc =
34c80 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
34c90 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52  Meta(p, 4, &maxR
34ca0 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ootPgno);.      
34cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34cc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
34cd0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
34ce0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
34cf0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
34d00 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d     if( iTable==m
34d10 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20  axRootPgno ){.  
34d20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
34d30 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
34d40 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65  ped is the table
34d50 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
34d60 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
34d70 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
34d80 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70   the database, p
34d90 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ut the root page
34da0 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
34db0 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t. .        */. 
34dc0 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
34dd0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
34de0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
34df0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
34e00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34e10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
34e20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
34e30 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
34e40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
34e50 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
34e60 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61  pped does not ha
34e70 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  ve the largest r
34e80 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
34e90 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
34ea0 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d  e database. So m
34eb0 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ove the page tha
34ec0 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20  t does into the 
34ed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20  .        ** gap 
34ee0 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
34ef0 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20  ted root-page.. 
34f00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34f10 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65    MemPage *pMove
34f20 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
34f30 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
34f40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34f50 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
34f60 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
34f70 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
34f80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34fa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34fc0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
34fd0 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50  ge(pBt, pMove, P
34fe0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
34ff0 30 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  0, iTable, 0);. 
35000 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
35010 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
35020 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
35060 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
35070 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  GetPage(pBt, max
35080 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
35090 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
350a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
350b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
350c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
350d0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  }.        rc = f
350e0 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  reePage(pMove);.
350f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
35100 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
35110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35130 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35150 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f  *piMoved = maxRo
35160 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  otPgno;.      }.
35170 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
35180 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d  e new 'max-root-
35190 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74  page' value in t
351a0 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
351b0 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  er. This.      *
351c0 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c  * is the old val
351d0 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73  ue less one, les
351e0 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68  s one more if th
351f0 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20  at happens to.  
35200 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74      ** be a root
35210 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65  -page number, le
35220 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20  ss one again if 
35230 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20  that is the.    
35240 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
35250 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f  E_PAGE..      */
35260 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67  .      maxRootPg
35270 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  no--;.      if( 
35280 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e  maxRootPgno==PEN
35290 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
352a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Bt) ){.        m
352b0 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
352c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
352d0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52  maxRootPgno==PTR
352e0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
352f0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a  maxRootPgno) ){.
35300 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
35310 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
35320 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78       assert( max
35330 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  RootPgno!=PENDIN
35340 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
35350 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   );..      rc = 
35360 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
35370 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78  teMeta(p, 4, max
35380 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  RootPgno);.    }
35390 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
353a0 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
353b0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
353c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
353d0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
353e0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69  {.    /* If sqli
353f0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
35400 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20  e was called on 
35410 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a  page 1. */.    z
35420 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50  eroPage(pPage, P
35430 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
35440 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  AF );.    releas
35450 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
35460 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
35470 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
35480 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
35490 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
354a0 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
354b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
354c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
354d0 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
354e0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
354f0 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
35500 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76  p, iTable, piMov
35510 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ed);.  sqlite3Bt
35520 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
35530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
35540 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74  .** Read the met
35550 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  a-information ou
35560 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
35570 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  file.  Meta[0].*
35580 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
35590 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63 75  of free pages cu
355a0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64  rrently in the d
355b0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31  atabase.  Meta[1
355c0 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74  ].** through met
355d0 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61  a[15] are availa
355e0 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 68  ble for use by h
355f0 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d  igher layers.  M
35600 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61  eta[0].** is rea
35610 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65  d-only, the othe
35620 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  rs are read/writ
35630 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63  e..** .** The sc
35640 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65  hema layer numbe
35650 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64  rs meta values d
35660 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20  ifferently.  At 
35670 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61  the schema.** la
35680 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65 74  yer (and the Set
35690 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43  Cookie and ReadC
356a0 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74  ookie opcodes) t
356b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
356c0 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f  free pages is no
356d0 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43  t visible.  So C
356e0 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20  ookie[0] is the 
356f0 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e  same as Meta[1].
35700 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
35710 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65  treeGetMeta(Btre
35720 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
35730 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62  32 *pMeta){.  Db
35740 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 3d 20  Page *pDbPage = 
35750 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
35760 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
35770 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  1;.  BtShared *p
35780 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
35790 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
357a0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
357b0 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52  = p->db;..  /* R
357c0 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61  eading a meta-da
357d0 74 61 20 76 61 6c 75 65 20 72 65 71 75 69 72 65  ta value require
357e0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  s a read-lock on
357f0 20 70 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e   page 1 (and hen
35800 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69  ce.  ** the sqli
35810 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
35820 20 57 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f   We grab this lo
35830 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ck regardless of
35840 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a   whether or.  **
35850 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f   not the SQLITE_
35860 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
35870 66 6c 61 67 20 69 73 20 73 65 74 20 28 74 68 65  flag is set (the
35880 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
35890 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20   page.  ** 1 is 
358a0 74 72 65 61 74 65 64 20 61 73 20 61 20 73 70 65  treated as a spe
358b0 63 69 61 6c 20 63 61 73 65 20 62 79 20 71 75 65  cial case by que
358c0 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
358d0 6c 65 4c 6f 63 6b 28 29 0a 20 20 2a 2a 20 61 6e  leLock().  ** an
358e0 64 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  d setSharedCache
358f0 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 20 20  TableLock())..  
35900 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53  */.  rc = queryS
35910 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
35920 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c  ock(p, 1, READ_L
35930 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
35940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35950 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
35960 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
35970 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
35980 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
35990 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69 66 28 20  dx<=15 );.  if( 
359a0 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20  pBt->pPage1 ){. 
359b0 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72 65 65     /* The b-tree
359c0 20 69 73 20 61 6c 72 65 61 64 79 20 68 6f 6c 64   is already hold
359d0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
359e0 74 6f 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  to page 1 of the
359f0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
35a00 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63   file. In this c
35a10 61 73 65 20 74 68 65 20 72 65 71 75 69 72 65 64  ase the required
35a20 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
35a30 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
35a40 65 63 74 6c 79 0a 20 20 20 20 2a 2a 20 66 72 6f  ectly.    ** fro
35a50 6d 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  m the page data 
35a60 6f 66 20 74 68 69 73 20 72 65 66 65 72 65 6e 63  of this referenc
35a70 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68  e. This is sligh
35a80 74 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 0a  tly faster than.
35a90 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 69 6e      ** requestin
35aa0 67 20 61 20 6e 65 77 20 72 65 66 65 72 65 6e 63  g a new referenc
35ab0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
35ac0 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20   layer..    */. 
35ad0 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e     pP1 = (unsign
35ae0 65 64 20 63 68 61 72 20 2a 29 70 42 74 2d 3e 70  ed char *)pBt->p
35af0 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
35b00 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
35b10 65 20 62 2d 74 72 65 65 20 64 6f 65 73 20 6e 6f  e b-tree does no
35b20 74 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  t have a referen
35b30 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f 66 20  ce to page 1 of 
35b40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35b50 65 2e 0a 20 20 20 20 2a 2a 20 4f 62 74 61 69 6e  e..    ** Obtain
35b60 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 70 61   one from the pa
35b70 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a  ger layer..    *
35b80 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
35b90 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
35ba0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50  pPager, 1, &pDbP
35bb0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
35bc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35bd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
35be0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35bf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 31 20 3d  .    }.    pP1 =
35c00 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
35c10 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
35c20 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
35c30 20 20 7d 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67    }.  *pMeta = g
35c40 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  et4byte(&pP1[36 
35c50 2b 20 69 64 78 2a 34 5d 29 3b 0a 0a 20 20 2f 2a  + idx*4]);..  /*
35c60 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 69   If the b-tree i
35c70 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20  s not holding a 
35c80 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
35c90 65 20 31 2c 20 74 68 65 6e 20 6f 6e 65 20 77 61  e 1, then one wa
35ca0 73 20 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  s .  ** requeste
35cb0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
35cc0 20 6c 61 79 65 72 20 69 6e 20 74 68 65 20 61 62   layer in the ab
35cd0 6f 76 65 20 62 6c 6f 63 6b 2e 20 52 65 6c 65 61  ove block. Relea
35ce0 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
35cf0 20 20 69 66 28 20 21 70 42 74 2d 3e 70 50 61 67    if( !pBt->pPag
35d00 65 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e1 ){.    sqlite
35d10 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
35d20 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
35d30 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  If autovacuumed 
35d40 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
35d50 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65  his build but we
35d60 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a   are trying to .
35d70 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61    ** access an a
35d80 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61  utovacuumed data
35d90 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  base, then make 
35da0 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61  the database rea
35db0 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66  donly. .  */.#if
35dc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35dd0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
35de0 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74   idx==4 && *pMet
35df0 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f  a>0 ) pBt->readO
35e00 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  nly = 1;.#endif.
35e10 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72  .  /* Grab the r
35e20 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65  ead-lock on page
35e30 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 65   1. */.  rc = se
35e40 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
35e50 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44  eLock(p, 1, READ
35e60 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65  _LOCK);.  sqlite
35e70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
35e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35e90 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61  /*.** Write meta
35ea0 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63  -information bac
35eb0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
35ec0 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73  ase.  Meta[0] is
35ed0 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  .** read-only an
35ee0 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69  d may not be wri
35ef0 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tten..*/.int sql
35f00 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
35f10 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
35f20 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61  t idx, u32 iMeta
35f30 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
35f40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
35f50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
35f60 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
35f70 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26  ssert( idx>=1 &&
35f80 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71   idx<=15 );.  sq
35f90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
35fa0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
35fb0 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
35fc0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
35fd0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
35fe0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
35ff0 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20 3d 20  1!=0 );.  pP1 = 
36000 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
36010 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
36020 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
36030 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
36040 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
36050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
36060 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  ut4byte(&pP1[36 
36070 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29  + idx*4], iMeta)
36080 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
36090 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
360a0 0a 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37 20  .    if( idx==7 
360b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
360c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
360d0 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a   || iMeta==0 );.
360e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4d        assert( iM
360f0 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d  eta==0 || iMeta=
36100 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  =1 );.      pBt-
36110 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 75  >incrVacuum = (u
36120 38 29 69 4d 65 74 61 3b 0a 20 20 20 20 7d 0a 23  8)iMeta;.    }.#
36130 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
36140 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
36150 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
36160 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
36170 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20  he flag byte at 
36180 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
36190 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74   the page that t
361a0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
361b0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
361c0 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ng to..*/.int sq
361d0 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28  lite3BtreeFlags(
361e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
361f0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
36200 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45   about CURSOR_RE
36210 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f  QUIRESEEK state?
36220 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74   Probably need t
36230 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74  o call.  ** rest
36240 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
36250 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  n() here..  */. 
36260 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
36270 0a 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  .  restoreCursor
36280 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
36290 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
362a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
362b0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ge];.  assert( c
362c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
362d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
362e0 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  t( pPage!=0 );. 
362f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36300 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74 20 29  pBt==pCur->pBt )
36310 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
36320 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
36330 64 72 4f 66 66 73 65 74 5d 3b 0a 7d 0a 0a 23 69  drOffset];.}..#i
36340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36350 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 2f 2a 0a  T_BTREECOUNT./*.
36360 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
36370 75 6d 65 6e 74 2c 20 70 43 75 72 2c 20 69 73 20  ument, pCur, is 
36380 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20  a cursor opened 
36390 6f 6e 20 73 6f 6d 65 20 62 2d 74 72 65 65 2e 20  on some b-tree. 
363a0 43 6f 75 6e 74 20 74 68 65 0a 2a 2a 20 6e 75 6d  Count the.** num
363b0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
363c0 6e 20 74 68 65 20 62 2d 74 72 65 65 20 61 6e 64  n the b-tree and
363d0 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
363e0 74 20 74 6f 20 2a 70 6e 45 6e 74 72 79 2e 0a 2a  t to *pnEntry..*
363f0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
36400 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
36410 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73  e operation is s
36420 75 63 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63  uccessfully exec
36430 75 74 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  uted. .** Otherw
36440 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
36450 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
36460 28 69 2e 65 2e 20 61 6e 20 49 4f 20 65 72 72 6f  (i.e. an IO erro
36470 72 20 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  r or database.**
36480 20 63 6f 72 72 75 70 74 69 6f 6e 29 20 61 6e 20   corruption) an 
36490 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
364a0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
364b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
364c0 65 65 43 6f 75 6e 74 28 42 74 43 75 72 73 6f 72  eeCount(BtCursor
364d0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 6e 45   *pCur, i64 *pnE
364e0 6e 74 72 79 29 7b 0a 20 20 69 36 34 20 6e 45 6e  ntry){.  i64 nEn
364f0 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
36500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36510 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
36520 20 69 6e 20 2a 70 6e 45 6e 74 72 79 20 2a 2f 0a   in *pnEntry */.
36530 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
36540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36550 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
36560 20 63 6f 64 65 20 2a 2f 0a 20 20 72 63 20 3d 20   code */.  rc = 
36570 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
36580 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61  ;..  /* Unless a
36590 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
365a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  the following lo
365b0 6f 70 20 72 75 6e 73 20 6f 6e 65 20 69 74 65 72  op runs one iter
365c0 61 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 0a 20  ation for each. 
365d0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
365e0 42 2d 54 72 65 65 20 73 74 72 75 63 74 75 72 65  B-Tree structure
365f0 20 28 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20   (not including 
36600 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
36610 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
36620 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36630 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b 20 20  .    int iIdx;  
36640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36650 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
36660 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64 65 20 69   of child node i
36670 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20  n parent */.    
36680 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
36690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 61     /* Current pa
366b0 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
366c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
366d0 68 69 73 20 69 73 20 61 20 6c 65 61 66 20 70 61  his is a leaf pa
366e0 67 65 20 6f 72 20 74 68 65 20 74 72 65 65 20 69  ge or the tree i
366f0 73 20 6e 6f 74 20 61 6e 20 69 6e 74 2d 6b 65 79  s not an int-key
36700 20 74 72 65 65 2c 20 74 68 65 6e 20 0a 20 20 20   tree, then .   
36710 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 63 6f   ** this page co
36720 6e 74 61 69 6e 73 20 63 6f 75 6e 74 61 62 6c 65  ntains countable
36730 20 65 6e 74 72 69 65 73 2e 20 49 6e 63 72 65 6d   entries. Increm
36740 65 6e 74 20 74 68 65 20 65 6e 74 72 79 20 63 6f  ent the entry co
36750 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20 61 63 63  unter.    ** acc
36760 6f 72 64 69 6e 67 6c 79 2e 0a 20 20 20 20 2a 2f  ordingly..    */
36770 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
36780 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
36790 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
367a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
367b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
367c0 0a 20 20 20 20 20 20 6e 45 6e 74 72 79 20 2b 3d  .      nEntry +=
367d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
367e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 50 61     }..    /* pPa
367f0 67 65 20 69 73 20 61 20 6c 65 61 66 20 6e 6f 64  ge is a leaf nod
36800 65 2e 20 54 68 69 73 20 6c 6f 6f 70 20 6e 61 76  e. This loop nav
36810 69 67 61 74 65 73 20 74 68 65 20 63 75 72 73 6f  igates the curso
36820 72 20 73 6f 20 74 68 61 74 20 69 74 20 0a 20 20  r so that it .  
36830 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74    ** points to t
36840 68 65 20 66 69 72 73 74 20 69 6e 74 65 72 69 6f  he first interio
36850 72 20 63 65 6c 6c 20 74 68 61 74 20 69 74 20 70  r cell that it p
36860 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 61 72  oints to the par
36870 65 6e 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ent of.    ** th
36880 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
36890 68 65 20 74 72 65 65 20 74 68 61 74 20 68 61 73  he tree that has
368a0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 76 69   not yet been vi
368b0 73 69 74 65 64 2e 20 54 68 65 0a 20 20 20 20 2a  sited. The.    *
368c0 2a 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  * pCur->aiIdx[pC
368d0 75 72 2d 3e 69 50 61 67 65 5d 20 76 61 6c 75 65  ur->iPage] value
368e0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
368f0 6e 64 65 78 20 6f 66 20 74 68 65 20 70 61 72 65  ndex of the pare
36900 6e 74 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 6f  nt cell.    ** o
36910 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 74  f the page, or t
36920 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
36930 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 67  cells in the pag
36940 65 20 69 66 20 74 68 65 20 6e 65 78 74 20 70 61  e if the next pa
36950 67 65 0a 20 20 20 20 2a 2a 20 74 6f 20 76 69 73  ge.    ** to vis
36960 69 74 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  it is the right-
36970 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
36980 65 6e 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ent..    **.    
36990 2a 2a 20 49 66 20 61 6c 6c 20 70 61 67 65 73 20  ** If all pages 
369a0 69 6e 20 74 68 65 20 74 72 65 65 20 68 61 76 65  in the tree have
369b0 20 62 65 65 6e 20 76 69 73 69 74 65 64 2c 20 72   been visited, r
369c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
369d0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  to the.    ** ca
369e0 6c 6c 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ller..    */.   
369f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
36a00 20 29 7b 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   ){.      do {. 
36a10 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
36a20 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
36a30 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61         /* All pa
36a40 67 65 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65  ges of the b-tre
36a50 65 20 68 61 76 65 20 62 65 65 6e 20 76 69 73 69  e have been visi
36a60 74 65 64 2e 20 52 65 74 75 72 6e 20 73 75 63 63  ted. Return succ
36a70 65 73 73 66 75 6c 6c 79 2e 20 2a 2f 0a 20 20 20  essfully. */.   
36a80 20 20 20 20 20 20 20 2a 70 6e 45 6e 74 72 79 20         *pnEntry 
36a90 3d 20 6e 45 6e 74 72 79 3b 0a 20 20 20 20 20 20  = nEntry;.      
36aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36ab0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
36ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
36ad0 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
36ae0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 77  (pCur);.      }w
36af0 68 69 6c 65 20 28 20 70 43 75 72 2d 3e 61 69 49  hile ( pCur->aiI
36b00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
36b10 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
36b20 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
36b30 6c 20 29 3b 0a 0a 20 20 20 20 20 20 70 43 75 72  l );..      pCur
36b40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
36b50 61 67 65 5d 2b 2b 3b 0a 20 20 20 20 20 20 70 50  age]++;.      pP
36b60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
36b70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
36b80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
36b90 65 73 63 65 6e 64 20 74 6f 20 74 68 65 20 63 68  escend to the ch
36ba0 69 6c 64 20 6e 6f 64 65 20 6f 66 20 74 68 65 20  ild node of the 
36bb0 63 65 6c 6c 20 74 68 61 74 20 74 68 65 20 63 75  cell that the cu
36bc0 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 0a  rsor currently .
36bd0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 61 74      ** points at
36be0 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72 69  . This is the ri
36bf0 67 68 74 2d 63 68 69 6c 64 20 69 66 20 28 69 49  ght-child if (iI
36c00 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
36c10 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 49  )..    */.    iI
36c20 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
36c30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
36c40 20 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61     if( iIdx==pPa
36c50 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
36c60 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
36c70 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
36c80 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
36c90 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
36ca0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 7d 65 6c 73  t+8]));.    }els
36cb0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  e{.      rc = mo
36cc0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
36cd0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
36ce0 6c 28 70 50 61 67 65 2c 20 69 49 64 78 29 29 29  l(pPage, iIdx)))
36cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
36d00 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  * An error has o
36d10 63 63 75 72 72 65 64 2e 20 52 65 74 75 72 6e 20  ccurred. Return 
36d20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a  an error code. *
36d30 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
36d40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
36d50 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20  eturn the pager 
36d60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
36d70 61 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72  a BTree.  This r
36d80 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
36d90 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
36da0 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
36db0 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69  ..*/.Pager *sqli
36dc0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74  te3BtreePager(Bt
36dd0 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
36de0 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  n p->pBt->pPager
36df0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
36e00 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
36e10 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41  TY_CHECK./*.** A
36e20 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20  ppend a message 
36e30 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
36e40 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  sage string..*/.
36e50 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
36e60 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e  kAppendMsg(.  In
36e70 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
36e80 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31  k,.  char *zMsg1
36e90 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
36ea0 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29  zFormat,.  ....)
36eb0 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
36ec0 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d    if( !pCheck->m
36ed0 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  xErr ) return;. 
36ee0 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d   pCheck->mxErr--
36ef0 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72  ;.  pCheck->nErr
36f00 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ++;.  va_start(a
36f10 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69  p, zFormat);.  i
36f20 66 28 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73  f( pCheck->errMs
36f30 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20 20 20 73  g.nChar ){.    s
36f40 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
36f50 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72  pend(&pCheck->er
36f60 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a  rMsg, "\n", 1);.
36f70 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73 67 31 20    }.  if( zMsg1 
36f80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  ){.    sqlite3St
36f90 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43  rAccumAppend(&pC
36fa0 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 7a 4d  heck->errMsg, zM
36fb0 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20  sg1, -1);.  }.  
36fc0 73 71 6c 69 74 65 33 56 58 50 72 69 6e 74 66 28  sqlite3VXPrintf(
36fd0 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
36fe0 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29   1, zFormat, ap)
36ff0 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
37000 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72    if( pCheck->er
37010 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65  rMsg.mallocFaile
37020 64 20 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d  d ){.    pCheck-
37030 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
37040 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  1;.  }.}.#endif 
37050 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
37060 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
37070 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
37080 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
37090 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64  _CHECK./*.** Add
370a0 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65   1 to the refere
370b0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
370c0 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68  ge iPage.  If th
370d0 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
370e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
370f0 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61   the page, add a
37100 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
37110 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  to pCheck->zErrM
37120 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  sg..** Return 1 
37130 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f  if there are 2 o
37140 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63  re more referenc
37150 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  es to the page a
37160 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68  nd 0 if.** if th
37170 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
37180 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
37190 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73   page..**.** Als
371a0 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
371b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
371c0 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74  in bounds..*/.st
371d0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
371e0 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70  f(IntegrityCk *p
371f0 43 68 65 63 6b 2c 20 50 67 6e 6f 20 69 50 61 67  Check, Pgno iPag
37200 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  e, char *zContex
37210 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  t){.  if( iPage=
37220 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
37230 20 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63   if( iPage>pChec
37240 6b 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  k->nPage ){.    
37250 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
37260 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
37270 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e   "invalid page n
37280 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65  umber %d", iPage
37290 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
372a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63  .  }.  if( pChec
372b0 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d  k->anRef[iPage]=
372c0 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =1 ){.    checkA
372d0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
372e0 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20   zContext, "2nd 
372f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
37300 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
37310 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
37320 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65  .  return  (pChe
37330 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d  ck->anRef[iPage]
37340 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ++)>1;.}..#ifnde
37350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
37360 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43  TOVACUUM./*.** C
37370 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e  heck that the en
37380 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
37390 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20  er-map for page 
373a0 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a  iChild maps to .
373b0 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c  ** page iParent,
373c0 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74   pointer type pt
373d0 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61  rType. If not, a
373e0 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  ppend an error m
373f0 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68  essage.** to pCh
37400 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eck..*/.static v
37410 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28  oid checkPtrmap(
37420 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
37430 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74  pCheck,   /* Int
37440 65 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e  egrity check con
37450 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  text */.  Pgno i
37460 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Child,          
37470 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e   /* Child page n
37480 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54  umber */.  u8 eT
37490 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
374a0 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
374b0 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a  inter map type *
374c0 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74  /.  Pgno iParent
374d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ,          /* Ex
374e0 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
374f0 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  ap parent page n
37500 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
37510 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
37520 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73    /* Context des
37530 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66  cription (used f
37540 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f  or error msg) */
37550 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
37560 75 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a  u8 ePtrmapType;.
37570 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61    Pgno iPtrmapPa
37580 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74  rent;..  rc = pt
37590 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e  rmapGet(pCheck->
375a0 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50  pBt, iChild, &eP
375b0 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72  trmapType, &iPtr
375c0 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  mapParent);.  if
375d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
375e0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
375f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 70 43  QLITE_NOMEM ) pC
37600 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  heck->mallocFail
37610 65 64 20 3d 20 31 3b 0a 20 20 20 20 63 68 65 63  ed = 1;.    chec
37620 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
37630 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
37640 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
37650 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
37660 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
37670 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
37680 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
37690 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
376a0 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
376b0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
376c0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
376d0 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
376e0 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
376f0 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
37700 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
37710 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
37720 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
37730 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
37740 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
37750 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
37760 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
37770 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
37780 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
37790 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
377a0 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
377b0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
377c0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
377d0 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
377e0 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
377f0 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
37800 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
37810 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
37820 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
37830 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
37840 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
37850 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
37860 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
37870 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
37880 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
37890 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
378a0 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
378b0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
378c0 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
378d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
378e0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
378f0 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
37900 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
37910 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
37920 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
37930 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
37940 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
37950 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
37960 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
37970 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
37980 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
37990 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
379a0 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
379b0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
379c0 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
379d0 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
379e0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
379f0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
37a00 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
37a10 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
37a20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
37a30 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
37a40 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
37a50 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
37a60 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
37a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37a80 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
37a90 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
37aa0 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
37ab0 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
37ac0 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
37ad0 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
37ae0 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
37af0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
37b00 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
37b10 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
37b20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
37b30 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
37b40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
37b50 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
37b60 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
37b70 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
37b80 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
37b90 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
37ba0 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
37bb0 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
37bc0 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
37bd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37be0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
37bf0 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
37c00 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
37c10 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
37c20 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
37c30 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
37c40 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
37c50 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
37c60 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
37c70 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
37c80 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b  sableSize/4-2 ){
37c90 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
37ca0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
37cb0 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
37cc0 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
37cd0 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
37ce0 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
37cf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
37d00 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
37d10 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
37d20 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
37d30 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
37d40 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
37d50 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
37d60 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
37d70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
37d80 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
37d90 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
37da0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
37db0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
37dc0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
37dd0 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
37de0 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
37df0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
37e00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
37e10 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
37e20 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
37e30 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
37e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
37e50 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
37e60 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
37e70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
37e80 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
37e90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
37ea0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
37eb0 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
37ec0 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
37ed0 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
37ee0 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
37ef0 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
37f00 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
37f10 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
37f20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
37f30 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
37f40 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
37f50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
37f60 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
37f70 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
37f80 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
37f90 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
37fa0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
37fb0 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
37fc0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
37fd0 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
37fe0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37ff0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
38000 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
38010 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
38020 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
38030 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
38040 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
38050 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
38060 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
38070 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
38080 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
38090 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
380a0 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
380b0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
380c0 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
380d0 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
380e0 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
380f0 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
38100 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
38110 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
38120 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
38130 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
38140 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
38150 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
38160 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
38170 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
38180 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
38190 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
381a0 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
381b0 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
381c0 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
381d0 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
381e0 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
381f0 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
38200 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
38210 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
38220 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
38230 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
38240 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
38250 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
38260 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
38270 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
38280 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
38290 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
382a0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
382b0 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
382c0 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
382d0 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
382e0 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
382f0 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
38300 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
38310 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
38320 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
38330 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
38340 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
38350 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
38360 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
38370 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
38380 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
38390 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
383a0 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
383b0 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
383c0 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
383d0 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
383e0 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
383f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
38400 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
38410 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
38420 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72   */.  char *zPar
38430 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50  entContext  /* P
38440 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f  ar