/ Hex Artifact Content
Login

Artifact 603ce1969c601d9bf3ea92d49a53a445912fa3bc:


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 35 38 20 32 30 30 39 2f 30  c,v 1.558 2009/0
0190: 31 2f 31 30 20 31 36 3a 31 35 3a 32 31 20 64 72  1/10 16:15:21 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 52 65 61 64 4c 6f 63 6b  nt checkReadLock
07a0: 73 28 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20  s(Btree*, Pgno, 
07b0: 42 74 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b  BtCursor*, i64);
07c0: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
07d0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
07e0: 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  HE.  /*.  ** The
07f0: 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79   functions query
0800: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63  TableLock(), loc
0810: 6b 54 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c  kTable() and unl
0820: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20  ockAllTables(). 
0830: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0840: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0850: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0860: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0870: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
0880: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
0890: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08a0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08b0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08c0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
08d0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
08e0: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
08f0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0900: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0910: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0920: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0930: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0940: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0950: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0960: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0970: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
0980: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
0990: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61  queryTableLock(a
09a0: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
09b0: 20 20 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61    #define lockTa
09c0: 62 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ble(a,b,c) SQLIT
09d0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75  E_OK.  #define u
09e0: 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61  nlockAllTables(a
09f0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
0a00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0a10: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
0a20: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
0a30: 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   btree handle p 
0a40: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
0a50: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
0a60: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
0a70: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
0a80: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
0a90: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
0aa0: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
0ab0: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
0ac0: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
0ad0: 28 62 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b  (by calling lock
0ae0: 54 61 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20  Table()), or.** 
0af0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
0b00: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
0b10: 69 6e 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  int queryTableLo
0b20: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
0b30: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
0b40: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
0b50: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
0b60: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
0b70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
0b80: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
0b90: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
0ba0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0bb0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
0bc0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
0bd0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
0be0: 20 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61   .  /* This is a
0bf0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
0c00: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
0c10: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
0c20: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
0c30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0c40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
0c50: 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72  /* If some other
0c60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
0c70: 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  olding an exclus
0c80: 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20  ive lock, the.  
0c90: 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  ** requested loc
0ca0: 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74  k may not be obt
0cb0: 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ained..  */.  if
0cc0: 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  ( pBt->pExclusiv
0cd0: 65 20 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75  e && pBt->pExclu
0ce0: 73 69 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72  sive!=p ){.    r
0cf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
0d00: 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  KED;.  }..  /* T
0d10: 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20  his (along with 
0d20: 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20  lockTable()) is 
0d30: 77 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e  where the ReadUn
0d40: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
0d50: 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  s.  ** dealt wit
0d60: 68 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  h. If the caller
0d70: 20 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72   is querying for
0d80: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64   a read-lock and
0d90: 20 74 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a   the flag is.  *
0da0: 2a 20 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63  * set, it is unc
0db0: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61  onditionally gra
0dc0: 6e 74 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74  nted - even if t
0dd0: 68 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c  here are write-l
0de0: 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ocks.  ** on the
0df0: 20 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69   table. If a wri
0e00: 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  te-lock is reque
0e10: 73 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e  sted, the ReadUn
0e20: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20  committed flag. 
0e30: 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69   ** is not consi
0e40: 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dered..  **.  **
0e50: 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63   In function loc
0e60: 6b 54 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72  kTable(), if a r
0e70: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61  ead-lock is dema
0e80: 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20  nded and the .  
0e90: 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  ** ReadUncommitt
0ea0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
0eb0: 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64 64 65  no entry is adde
0ec0: 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c  d to the locks l
0ed0: 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61  ist .  ** (BtSha
0ee0: 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a  red.pLock)..  **
0ef0: 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69  .  ** To summari
0f00: 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61 64 55  ze: If the ReadU
0f10: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
0f20: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61  is set, then rea
0f30: 64 20 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a  d cursors do.  *
0f40: 2a 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20  * not create or 
0f50: 72 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f  respect table lo
0f60: 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67  cks. The locking
0f70: 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61   procedure for a
0f80: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72   .  ** write-cur
0f90: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  sor does not cha
0fa0: 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
0fb0: 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e  .    0==(p->db->
0fc0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
0fd0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c  dUncommitted) ||
0fe0: 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49   .    eLock==WRI
0ff0: 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69  TE_LOCK ||.    i
1000: 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  Tab==MASTER_ROOT
1010: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  .  ){.    for(pI
1020: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
1030: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
1040: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1050: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1060: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
1070: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
1080: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 74   .          (pIt
1090: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
10a0: 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f   || eLock!=READ_
10b0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  LOCK) ){.       
10c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
10d0: 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  OCKED;.      }. 
10e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1100: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
1110: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1120: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
1130: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1140: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
1150: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
1160: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1170: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
1180: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
1190: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
11a0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
11b0: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
11c0: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
11d0: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
11e0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
11f0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1200: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
1210: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
1220: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
1230: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
1240: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
1250: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
1260: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61  tatic int lockTa
1270: 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ble(Btree *p, Pg
1280: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
1290: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
12a0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12b0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
12c0: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
12d0: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
12e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
12f0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1300: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
1310: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
1320: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
1330: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
1340: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  !=0 );..  /* Thi
1350: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1360: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1370: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1380: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1390: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
13a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13b0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
13c0: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61  LITE_OK==queryTa
13d0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
13e0: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
13f0: 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75  /* If the read-u
1400: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1410: 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61  is set and a rea
1420: 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  d-lock is reques
1430: 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ted,.  ** return
1440: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61   early without a
1450: 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74  dding an entry t
1460: 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  o the BtShared.p
1470: 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20  Lock list. See. 
1480: 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66   ** comment in f
1490: 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62  unction queryTab
14a0: 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72  leLock() for mor
14b0: 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69  e info on handli
14c0: 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61  ng .  ** the Rea
14d0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
14e0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
14f0: 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73     (p->db->flags
1500: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1510: 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20 20  mmitted) && .   
1520: 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f   (eLock==READ_LO
1530: 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c  CK) &&.    iTabl
1540: 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  e!=MASTER_ROOT. 
1550: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1560: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1570: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
1580: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
1590: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
15a0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
15b0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
15c0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
15d0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
15e0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
15f0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1600: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
1610: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1620: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
1630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1640: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1650: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
1660: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
1670: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
1680: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
1690: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
16a0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
16b0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
16c0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
16d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
16e0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
16f0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
1700: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1710: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
1720: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
1730: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1740: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1750: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
1760: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
1770: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
1780: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
1790: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
17a0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
17b0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
17c0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
17d0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
17e0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
17f0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
1800: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
1810: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1820: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
1830: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
1840: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
1850: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
1860: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
1870: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
1880: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
1890: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
18a0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
18b0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
18c0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
18d0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
18e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
18f0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
1900: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1910: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1920: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1930: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1940: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1950: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1960: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
1970: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
1980: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
1990: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63  calls to the loc
19a0: 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63  kTable().** proc
19b0: 65 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42  edure) held by B
19c0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a  tree handle p..*
19d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
19e0: 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74  lockAllTables(Bt
19f0: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1a00: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a10: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70  t;.  BtLock **pp
1a20: 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f  Iter = &pBt->pLo
1a30: 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ck;..  assert( s
1a40: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1a50: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1a60: 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c  sert( p->sharabl
1a70: 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20  e || 0==*ppIter 
1a80: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
1a90: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
1aa0: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
1ab0: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
1ac0: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
1ad0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63  ==0 || pBt->pExc
1ae0: 6c 75 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70  lusive==pLock->p
1af0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 69 66 28  Btree );.    if(
1b00: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
1b10: 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74  p ){.      *ppIt
1b20: 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  er = pLock->pNex
1b30: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1b40: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
1b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b60: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
1b70: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1b80: 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78  ..  if( pBt->pEx
1b90: 63 6c 75 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20  clusive==p ){.  
1ba0: 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76    pBt->pExclusiv
1bb0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  e = 0;.  }.}.#en
1bc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1bd0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
1be0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
1bf0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
1c00: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
1c10: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1c20: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  ce */../*.** Ver
1c30: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
1c40: 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65  sor holds a mute
1c50: 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
1c60: 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  d.*/.#ifndef NDE
1c70: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
1c80: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c90: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1ca0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
1cb0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
1cc0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
1cd0: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
1ce0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1cf0: 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  B./*.** Invalida
1d00: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1d10: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1d20: 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c  for cursor pCur,
1d30: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
1d40: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
1d50: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1d60: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d70: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d80: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d90: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
1da0: 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
1db0: 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f  low);.  pCur->aO
1dc0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a  verflow = 0;.}..
1dd0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
1de0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1df0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
1e00: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
1e10: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
1e20: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
1e30: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
1e40: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
1e50: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1e60: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
1e70: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
1e80: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
1e90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ea0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1eb0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
1ec0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1ed0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
1ee0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1ef0: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  e(p);.  }.}.#els
1f00: 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  e.  #define inva
1f10: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1f20: 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65  che(x).  #define
1f30: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1f40: 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23  erflowCache(x).#
1f50: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  endif../*.** Sav
1f60: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
1f70: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
1f80: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
1f90: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
1fa0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
1fb0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
1fc0: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
1fd0: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1fe0: 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  EEK..*/.static i
1ff0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
2000: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
2010: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2020: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
2030: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2040: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
2050: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
2060: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
2070: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2080: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
2090: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
20a0: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
20b0: 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49  ->nKey);..  /* I
20c0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
20d0: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
20e0: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
20f0: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
2100: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
2110: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
2120: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
2130: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
2140: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
2150: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
2160: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
2170: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
2180: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
2190: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
21a0: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
21b0: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
21c0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
21d0: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
21e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
21f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
2200: 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
2210: 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76  ->intKey){.    v
2220: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
2230: 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
2240: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
2250: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
2260: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2270: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
2280: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
2290: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
22a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22b0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
22c0: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
22d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22f0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
2300: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2310: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2320: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
2330: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
2340: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
2350: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
2360: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
2370: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2380: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
2390: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
23a0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
23b0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
23c0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
23d0: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
23e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
23f0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
2400: 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65   -1;.    pCur->e
2410: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
2420: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
2430: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
2440: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
2450: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2460: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
2470: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
2480: 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74  l cursors except
2490: 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e   pExcept open on
24a0: 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77   the table .** w
24b0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
24c0: 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68  oot. Usually, th
24d0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  is is called jus
24e0: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a  t before cursor.
24f0: 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73  ** pExcept is us
2500: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
2510: 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c   table (BtreeDel
2520: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
2530: 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  sert())..*/.stat
2540: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
2550: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
2560: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
2570: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
2580: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
2590: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
25a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
25c0: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
25d0: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
25e0: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
25f0: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
2600: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
2610: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
2620: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
2630: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
2640: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
2650: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
2660: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2670: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
2680: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2690: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  on(p);.      if(
26a0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
26b0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
26c0: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
26e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26f0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
2700: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2710: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
2720: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2730: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
2740: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
2750: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2760: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
2770: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
2780: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
2790: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
27a0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
27b0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
27c0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
27d0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
27e0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
27f0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
2800: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
2810: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
2820: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
2830: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
2840: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
2850: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
2860: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
2870: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
2880: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
2890: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
28a0: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
28b0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
28c0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
28d0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
28e0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
28f0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  sition()..*/.int
2900: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73   sqlite3BtreeRes
2910: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2920: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
2930: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
2940: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2950: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2960: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2970: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
2980: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
2990: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
29a0: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
29b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
29c0: 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20  Cur->skip;.  }. 
29d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
29e0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
29f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2a00: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
2a10: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
2a20: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72  ->nKey, 0, &pCur
2a30: 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72  ->skip);.  if( r
2a40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a60: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
2a70: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
2a80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2a90: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2aa0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2ab0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ac0: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a  _INVALID );.  }.
2ad0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ae0: 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43  #define restoreC
2af0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
2b00: 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e   \.  (p->eState>
2b10: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
2b20: 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20  EEK ? \.        
2b30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73   sqlite3BtreeRes
2b40: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2b50: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
2b60: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
2b70: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
2b80: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2b90: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
2ba0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
2bb0: 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  on it.** was las
2bc0: 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75  t placed at.  Cu
2bd0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
2be0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
2bf0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
2c00: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
2c10: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
2c20: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
2c30: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
2c40: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
2c50: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
2c60: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
2c70: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
2c80: 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69   is set to one i
2c90: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
2ca0: 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20   moved and 0 if 
2cb0: 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
2cc0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
2cd0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
2ce0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
2cf0: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2d00: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  ;..  rc = restor
2d10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2d20: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
2d30: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
2d40: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
2d50: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
2d60: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2d70: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2d80: 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20  ur->skip!=0 ){. 
2d90: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
2da0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2db0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a  *pHasMoved = 0;.
2dc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2dd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
2de0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2df0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
2e00: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
2e10: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
2e20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
2e30: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
2e40: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
2e50: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
2e60: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
2e70: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
2e80: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
2e90: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
2ea0: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
2eb0: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
2ec0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
2ed0: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
2ee0: 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69  apPage;.  Pgno i
2ef0: 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61  PtrMap, ret;.  a
2f00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2f10: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2f20: 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65  utex) );.  nPage
2f30: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
2f40: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
2f50: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
2f60: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
2f70: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
2f80: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
2f90: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
2fa0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
2fb0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2fc0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
2fd0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
2fe0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
2ff0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
3000: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
3010: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
3020: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
3030: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
3040: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
3050: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
3060: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
3070: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
3080: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
3090: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
30a0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
30b0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
30c0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
30d0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
30e0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
30f0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
3100: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
3110: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
3120: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
3130: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
3140: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
3150: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
3160: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
3170: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
3180: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
3190: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
31a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
31b0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
31c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
31d0: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
31e0: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
31f0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
3200: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
3210: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3220: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
3230: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
3240: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
3250: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
3260: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
3270: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
3280: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
3290: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
32a0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
32b0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
32c0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
32d0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
32e0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72   key==0 ){.    r
32f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
3300: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
3310: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
3320: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
3330: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
3340: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
3350: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
3360: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
3370: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3380: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
3390: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
33a0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
33b0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
33c0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
33d0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
33e0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
33f0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
3400: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
3410: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
3420: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
3430: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
3440: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
3450: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
3460: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
3470: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72   parent));.    r
3480: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
3490: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
34a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
34c0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
34d0: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
34e0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
34f0: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
3500: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
3510: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
3520: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72  ef(pDbPage);.  r
3530: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3540: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
3550: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
3560: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
3570: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
3580: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
3590: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
35a0: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
35b0: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
35c0: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
35d0: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
35e0: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
35f0: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
3600: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
3610: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
3620: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
3630: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
3640: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
3650: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
3660: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
3670: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
3680: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
3690: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
36a0: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
36b0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
36c0: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
36d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
36e0: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
36f0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
3700: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3710: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
3720: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
3730: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
3740: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
3750: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
3760: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
3770: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3780: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
3790: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
37a0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
37b0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
37c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
37d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
37e0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
37f0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
3800: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
3810: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
3820: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
3830: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
3840: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
3850: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
3860: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
3870: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
3880: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
3890: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
38a0: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
38b0: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
38c0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
38d0: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
38e0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
38f0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45  Page);.  if( *pE
3900: 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70  Type<1 || *pETyp
3910: 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e>5 ) return SQL
3920: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
3930: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3940: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
3950: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
3960: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
3970: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
3980: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
3990: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
39a0: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65  #define ptrmapGe
39b0: 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54  t(w,x,y,z) SQLIT
39c0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70  E_OK.  #define p
39d0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a  trmapPutOvfl(y,z
39e0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
39f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
3a00: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
3a10: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
3a20: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
3a30: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
3a40: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
3a50: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
3a60: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
3a70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
3a80: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
3a90: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
3aa0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
3ab0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
3ac0: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
3ad0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
3ae0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
3af0: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
3b00: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
3b10: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
3b20: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61  t2byte(&(P)->aDa
3b30: 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73  ta[(P)->cellOffs
3b40: 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a  et+2*(I)])))../*
3b50: 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20  .** This a more 
3b60: 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20  complex version 
3b70: 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68  of findCell() th
3b80: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
3b90: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f  pages that do co
3ba0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
3bb0: 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72  ells.  See inser
3bc0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  t.*/.static u8 *
3bd0: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
3be0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
3bf0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69   int iCell){.  i
3c00: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
3c10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3c20: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
3c30: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
3c40: 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  =pPage->nOverflo
3c50: 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  w-1; i>=0; i--){
3c60: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
3c70: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
3c80: 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76   *pOvfl;.    pOv
3c90: 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76  fl = &pPage->aOv
3ca0: 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70  fl[i];.    k = p
3cb0: 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69  Ovfl->idx;.    i
3cc0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
3cd0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
3ce0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
3cf0: 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c  urn pOvfl->pCell
3d00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3d10: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
3d20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
3d30: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
3d40: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
3d50: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
3d60: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
3d70: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
3d80: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
3d90: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
3da0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
3db0: 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65  unction.  sqlite
3dc0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
3dd0: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
3de0: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
3df0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
3e00: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
3e10: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a  ParseCellPtr() .
3e20: 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  ** takes a point
3e30: 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  er to the body o
3e40: 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74  f the cell as it
3e50: 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  s second argumen
3e60: 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  t..**.** Within 
3e70: 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70  this file, the p
3e80: 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f  arseCell() macro
3e90: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69   can be called i
3ea0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c  nstead of.** sql
3eb0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
3ec0: 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73  llPtr(). Using s
3ed0: 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74  ome compilers, t
3ee0: 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74  his will be fast
3ef0: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
3f00: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3f10: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
3f20: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
3f30: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
3f40: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
3f50: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
3f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
3f70: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
3f80: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
3f90: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
3fa0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
3fb0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3fc0: 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20  ){.  u16 n;     
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fe0: 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20  Number bytes in 
3ff0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61  cell content hea
4000: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  der */.  u32 nPa
4010: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
4020: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
4030: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
4040: 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  oad */..  assert
4050: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4060: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
4070: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49  >mutex) );..  pI
4080: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
4090: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
40a0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
40b0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
40c0: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
40d0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
40e0: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
40f0: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
4100: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
4110: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
4120: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
4130: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
4140: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
4150: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d  nPayload);.    }
4160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79  else{.      nPay
4170: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  load = 0;.    }.
4180: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
4190: 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75  nt(&pCell[n], (u
41a0: 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  64*)&pInfo->nKey
41b0: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44  );.    pInfo->nD
41c0: 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  ata = nPayload;.
41d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
41e0: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20  fo->nData = 0;. 
41f0: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
4200: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e  t32(&pCell[n], n
4210: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49  Payload);.    pI
4220: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
4230: 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  load;.  }.  pInf
4240: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
4250: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
4260: 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20  >nHeader = n;.  
4270: 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c  if( likely(nPayl
4280: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
4290: 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
42a0: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
42b0: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
42c0: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
42d0: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
42e0: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
42f0: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
4300: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
4310: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
4320: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
4330: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
4340: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
4350: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53   bytes */.    nS
4360: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
4370: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
4380: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
4390: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
43a0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
43b0: 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20  .    if( (nSize 
43c0: 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  & ~3)==0 ){.    
43d0: 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20    nSize = 4;    
43e0: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63      /* Minimum c
43f0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
4400: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
4410: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e  ->nSize = (u16)n
4420: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
4430: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
4440: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
4450: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
4460: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
4470: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
4480: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
4490: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
44a0: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
44b0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
44c0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
44d0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
44e0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
44f0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
4500: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
4510: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
4520: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
4530: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
4540: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
4550: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
4560: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
4570: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
4580: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
4590: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
45a0: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
45b0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
45c0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
45d0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
45e0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
45f0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
4600: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
4610: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
4620: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4630: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4640: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
4650: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
4660: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4670: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4680: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
4690: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
46a0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
46b0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
46c0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
46d0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
46e0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
46f0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
4700: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
4710: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
4720: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
4730: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
4740: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
4750: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
4760: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
4770: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
4780: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
4790: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
47a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
47b0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
47c0: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
47d0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
47e0: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
47f0: 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b  (pInfo->nLocal +
4800: 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e   n);.    pInfo->
4810: 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69  nSize = pInfo->i
4820: 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20  Overflow + 4;.  
4830: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73  }.}.#define pars
4840: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
4850: 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73  ll, pInfo) \.  s
4860: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
4870: 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c  CellPtr((pPage),
4880: 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65   findCell((pPage
4890: 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49  ), (iCell)), (pI
48a0: 6e 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74  nfo)).void sqlit
48b0: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
48c0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
48d0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
48e0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
48f0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
4900: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
4910: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
4920: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
4930: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
4940: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
4950: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
4960: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
4970: 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c  */.){.  parseCel
4980: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4990: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
49a0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
49b0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
49c0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
49d0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
49e0: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
49f0: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
4a00: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
4a10: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
4a20: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
4a30: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
4a40: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
4a50: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
4a60: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
4a70: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
4a80: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
4a90: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
4aa0: 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  G.static u16 cel
4ab0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
4ac0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
4ad0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
4ae0: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  o;.  sqlite3Btre
4af0: 65 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  eParseCell(pPage
4b00: 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , iCell, &info);
4b10: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
4b20: 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73  Size;.}.#endif.s
4b30: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
4b40: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
4b50: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
4b60: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
4b70: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  o;.  sqlite3Btre
4b80: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
4b90: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
4ba0: 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66  o);.  return inf
4bb0: 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e  o.nSize;.}..#ifn
4bc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4bd0: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
4be0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
4bf0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
4c00: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
4c10: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
4c20: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
4c30: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
4c40: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
4c50: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
4c60: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
4c70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4c80: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
4c90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4ca0: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65  u8 *pCell){.  Ce
4cb0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61  llInfo info;.  a
4cc0: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
4cd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4ce0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
4cf0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
4d00: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
4d10: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
4d20: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
4d30: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
4d40: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28  yload );.  if( (
4d50: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
4d60: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
4d70: 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
4d80: 63 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  cal ){.    Pgno 
4d90: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
4da0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
4db0: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74  rflow]);.    ret
4dc0: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50  urn ptrmapPut(pP
4dd0: 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20  age->pBt, ovfl, 
4de0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
4df0: 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
4e00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
4e10: 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
4e20: 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  If the cell with
4e30: 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20   index iCell on 
4e40: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
4e50: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
4e60: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
4e70: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
4e80: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
4e90: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
4ea0: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
4eb0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
4ec0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
4ed0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
4ee0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
4ef0: 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65  8 *pCell;.  asse
4f00: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
4f10: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
4f20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
4f30: 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66  Cell = findOverf
4f40: 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  lowCell(pPage, i
4f50: 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
4f60: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
4f70: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
4f80: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
4f90: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
4fa0: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
4fb0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
4fc0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
4fd0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
4fe0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
4ff0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
5000: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
5010: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
5020: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
5030: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
5040: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
5050: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
5060: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
5070: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
5080: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
5090: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
50c0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
50d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50e0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
50f0: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
5100: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5120: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
5130: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
5140: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
5150: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
5180: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
5190: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
51b0: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
51c0: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
51d0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
51e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
51f0: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
5200: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
5210: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5220: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
5230: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
5240: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
5250: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
5260: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
5270: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
5280: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
5290: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
52a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
52b0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
52c0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
52d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
52e0: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
52f0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
5300: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
5310: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
5320: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
5330: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
5340: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
5350: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
5360: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
5370: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5380: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
5390: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
53a0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
53b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
53c0: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
53d0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
53e0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
53f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5400: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
5410: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
5420: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
5430: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
5440: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
5450: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
5460: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
5470: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
5480: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
5490: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
54a0: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
54b0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
54c0: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
54d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
54e0: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
54f0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
5500: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
5510: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
5520: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
5530: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
5540: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
5550: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
5560: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
5570: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28  ableSize;.  for(
5580: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
5590: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
55a0: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
55b0: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
55c0: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
55d0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
55e0: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
55f0: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
5600: 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73  ;.    if( pc>=us
5610: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
5620: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5630: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
5640: 20 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63    }.    size = c
5650: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
5660: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
5670: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
5680: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c      if( cbrk<cel
5690: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20  lOffset+2*nCell 
56a0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
56b0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
56c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
56d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
56e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72  .    assert( cbr
56f0: 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  k+size<=usableSi
5700: 7a 65 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b  ze && cbrk>=0 );
5710: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
5720: 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70  a[cbrk], &temp[p
5730: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70  c], size);.    p
5740: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
5750: 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  brk);.  }.  asse
5760: 72 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66  rt( cbrk>=cellOf
5770: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a  fset+2*nCell );.
5780: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5790: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
57a0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
57b0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
57c0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
57d0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20  +7] = 0;.  addr 
57e0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  = cellOffset+2*n
57f0: 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Cell;.  memset(&
5800: 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63  data[addr], 0, c
5810: 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73  brk-addr);.  ass
5820: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5830: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
5840: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
5850: 20 20 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21    if( cbrk-addr!
5860: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
5870: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5880: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
5890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
58a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
58b0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
58c0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
58d0: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
58e0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
58f0: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
5900: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
5910: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
5920: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
5930: 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  .  The caller gu
5940: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
5950: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a  ere is enough.**
5960: 20 73 70 61 63 65 2e 20 20 54 68 69 73 20 72 6f   space.  This ro
5970: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72  utine will never
5980: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   fail..**.** If 
5990: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
59a0: 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65  s nBytes of free
59b0: 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20   space but does 
59c0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e  not contain.** n
59d0: 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75  Bytes of contigu
59e0: 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20  ous free space, 
59f0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
5a00: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  e automatically.
5a10: 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65  ** calls defrage
5a20: 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f  mentPage() to co
5a30: 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72  nsolidate all fr
5a40: 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ee space before 
5a50: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74  .** allocating t
5a60: 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f  he new chunk..*/
5a70: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
5a80: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
5a90: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
5aa0: 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  yte){.  int addr
5ab0: 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74  , pc, hdr;.  int
5ac0: 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72   size;.  int nFr
5ad0: 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20  ag;.  int top;. 
5ae0: 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e   int nCell;.  in
5af0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  t cellOffset;.  
5b00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
5b10: 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d  ata;.  .  data =
5b20: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
5b30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5b40: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5b50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5b60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5b70: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
5b80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5b90: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
5ba0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5bb0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
5bc0: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
5bd0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
5be0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
5bf0: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
5c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5c10: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
5c20: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  0 );.  pPage->nF
5c30: 72 65 65 20 2d 3d 20 28 75 31 36 29 6e 42 79 74  ree -= (u16)nByt
5c40: 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  e;.  hdr = pPage
5c50: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20  ->hdrOffset;..  
5c60: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
5c70: 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  +7];.  if( nFrag
5c80: 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  <60 ){.    /* Se
5c90: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
5ca0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
5cb0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
5cc0: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20  to satisfy the. 
5cd0: 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75     ** space requ
5ce0: 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72  est. */.    addr
5cf0: 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68   = hdr+1;.    wh
5d00: 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32 62  ile( (pc = get2b
5d10: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5d20: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a  )>0 ){.      siz
5d30: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
5d40: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
5d50: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
5d60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
5d70: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
5d80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 69  ;.        if( si
5d90: 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20  ze<nByte+4 ){.  
5da0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
5db0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
5dc0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
5dd0: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
5de0: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
5df0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  x);.          re
5e00: 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20  turn pc;.       
5e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5e20: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5e30: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
5e40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
5e50: 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  + x;.        }. 
5e60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64       }.      add
5e70: 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20  r = pc;.    }.  
5e80: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
5e90: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
5ea0: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
5eb0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
5ec0: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
5ed0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
5ee0: 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f   area..  */.  to
5ef0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
5f00: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43  ta[hdr+5]);.  nC
5f10: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
5f20: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
5f30: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
5f40: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
5f50: 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20    if( nFrag>=60 
5f60: 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  || cellOffset + 
5f70: 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20  2*nCell > top - 
5f80: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 64 65 66  nByte ){.    def
5f90: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
5fa0: 65 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  e);.    top = ge
5fb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5fc0: 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20  +5]);.  }.  top 
5fd0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  -= nByte;.  asse
5fe0: 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  rt( cellOffset +
5ff0: 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20   2*nCell <= top 
6000: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
6010: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
6020: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6030: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
6040: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
6050: 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
6060: 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  top;.}../*.** Re
6070: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
6080: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
6090: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
60a0: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
60b0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
60c0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
60d0: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
60e0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
60f0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
6100: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
6110: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
6120: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
6130: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
6140: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
6150: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
6160: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
6170: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
6180: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
6190: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
61a0: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
61b0: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
61c0: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
61d0: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
61e0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
61f0: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
6200: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
6210: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6220: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
6230: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
6240: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
6250: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
6260: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
6270: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
6280: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
6290: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
62a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
62b0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
62c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
62d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
62e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
62f0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
6300: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
6310: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
6320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
6330: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
6340: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
6350: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
6360: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
6370: 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54  the SECURE_DELET
6380: 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  E .  ** option i
6390: 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
63a0: 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d  pile-time */.  m
63b0: 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72  emset(&data[star
63c0: 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65  t], 0, size);.#e
63d0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
63e0: 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e  he space back in
63f0: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
6400: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
6410: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
6420: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
6430: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
6440: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
6450: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6460: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
6470: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
6480: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
6490: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
64a0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
64b0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61     if( pbegin<=a
64c0: 64 64 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65  ddr ) {.      re
64d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
64e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
64f0: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
6500: 6e 3b 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62  n;.  }.  if ( pb
6510: 65 67 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d  egin>pPage->pBt-
6520: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20  >usableSize-4 ) 
6530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6540: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6550: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
6560: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
6570: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
6580: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
6590: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
65a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
65b0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
65c0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
65d0: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
65e0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
65f0: 3d 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20  = (u16)size;..  
6600: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
6610: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
6620: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
6630: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
6640: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
6650: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
6660: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
6670: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
6680: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
6690: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
66a0: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
66b0: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
66c0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
66d0: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
66e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
66f0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
6700: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
6710: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
6720: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
6730: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
6740: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
6750: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
6760: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
6770: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
6780: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
6790: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
67a0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
67b0: 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20  set+7]) ){.     
67c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
67d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
67e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74       }.      dat
67f0: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
6800: 65 74 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61  et+7] -= (u8)fra
6810: 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  g;.      x = get
6820: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
6830: 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  t]);.      put2b
6840: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6850: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d  ], x);.      x =
6860: 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74   pnext + get2byt
6870: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
6880: 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  ) - pbegin;.    
6890: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
68a0: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a  [pbegin+2], x);.
68b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
68c0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
68d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
68e0: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
68f0: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
6900: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
6910: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
6920: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
6930: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
6940: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
6950: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
6960: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
6970: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
6980: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
6990: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
69a0: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
69b0: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
69c0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
69d0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67  data[hdr+5]) + g
69e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
69f0: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75  egin+2]);.    pu
6a00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6a10: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20  +5], top);.  }. 
6a20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6a30: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
6a40: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
6a50: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
6a60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6a70: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
6a80: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
6a90: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
6aa0: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
6ab0: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
6ac0: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
6ad0: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
6ae0: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
6af0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
6b00: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
6b10: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
6b20: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
6b30: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
6b40: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
6b50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
6b60: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
6b70: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
6b80: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
6b90: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
6ba0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
6bb0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
6bc0: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
6bd0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
6be0: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
6bf0: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
6c00: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
6c10: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6c20: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
6c30: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
6c40: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
6c50: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
6c60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
6c70: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
6c80: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
6c90: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
6ca0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6cb0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6cc0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
6cd0: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
6ce0: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
6cf0: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
6d00: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
6d10: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
6d20: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
6d30: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
6d40: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42  Page->leaf;.  pB
6d50: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
6d60: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
6d70: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
6d80: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
6d90: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
6da0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
6db0: 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65  >hasData = pPage
6dc0: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  ->leaf;.    pPag
6dd0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
6de0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
6df0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
6e00: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
6e10: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
6e20: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
6e30: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
6e40: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
6e50: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
6e60: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
6e70: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
6e80: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
6e90: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
6ea0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
6eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6ec0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6ed0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
6ee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
6f00: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
6f10: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
6f20: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
6f30: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
6f40: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
6f50: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
6f60: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
6f70: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
6f80: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
6f90: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
6fa0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
6fb0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
6fc0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
6fd0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
6fe0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
6ff0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
7000: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
7010: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
7020: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
7030: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
7040: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
7050: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7060: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
7070: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
7080: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
7090: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
70a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
70b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
70c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
70d0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
70e0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
70f0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
7100: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
7110: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
7120: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7130: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
7140: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7150: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
7160: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7170: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
7180: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
7190: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
71a0: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
71b0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
71c0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
71d0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
71e0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
71f0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
7200: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
7210: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
7220: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
7230: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
7240: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
7250: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
7260: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
7270: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
7280: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
7290: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61  e */.    u16 usa
72a0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
72b0: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
72c0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
72d0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
72e0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
72f0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
7300: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
7310: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
7320: 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65  */.    u16 nFree
7330: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
7340: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
7350: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
7360: 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20  */.    u16 top; 
7370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
7380: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
7390: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
73a0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
73b0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
73c0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
73d0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
73e0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
73f0: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
7400: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
7410: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
7420: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7430: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
7440: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
7450: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
7460: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
7470: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
7480: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
7490: 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67  ze - 1;.    pPag
74a0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
74b0: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
74c0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
74d0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
74e0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
74f0: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
7500: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
7510: 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  f;.    top = get
7520: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
7530: 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  5]);.    pPage->
7540: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
7550: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
7560: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
7570: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
7580: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
7590: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
75a0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
75b0: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
75c0: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
75d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
75e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
75f0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f    }.  .    /* Co
7600: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
7610: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
7620: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
7630: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7640: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
7650: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
7660: 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c  7] + top - (cell
7670: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
7680: 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 77 68  ->nCell);.    wh
7690: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
76a0: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
76b0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  e;.      if( pc>
76c0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a  usableSize-4 ){.
76d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
76e0: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
76f0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
7700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7710: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
7720: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
7730: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7740: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
7750: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
7760: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
7770: 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20    if( next>0 && 
7780: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20  next<=pc+size+3 
7790: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
77a0: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
77b0: 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  e in accending o
77c0: 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
77d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
77e0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
77f0: 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
7800: 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20   += size;.      
7810: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
7820: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
7830: 65 20 3d 20 28 75 31 36 29 6e 46 72 65 65 3b 0a  e = (u16)nFree;.
7840: 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75      if( nFree>=u
7850: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
7860: 20 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65     /* Free space
7870: 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74   cannot exceed t
7880: 6f 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a  otal page size *
7890: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
78a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
78b0: 50 54 3b 20 0a 20 20 20 20 7d 0a 0a 23 69 66 20  PT; .    }..#if 
78c0: 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  0.  /* Check tha
78d0: 74 20 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74  t all the offset
78e0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66  s in the cell of
78f0: 66 73 65 74 20 61 72 72 61 79 20 61 72 65 20 77  fset array are w
7900: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20  ithin range. .  
7910: 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e  ** .  ** Omittin
7920: 67 20 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e  g this consisten
7930: 63 79 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69  cy check and usi
7940: 6e 67 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61  ng the pPage->ma
7950: 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a  skPage mask.  **
7960: 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72   to prevent over
7970: 72 75 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65  running the page
7980: 20 62 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43   buffer in findC
7990: 65 6c 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e  ell() results in
79a0: 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72   a.  ** 2.5% per
79b0: 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20  formance gain.. 
79c0: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a   */.  {.    u8 *
79d0: 70 4f 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pOff;        /* 
79e0: 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f  Iterator used to
79f0: 20 63 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20   check all cell 
7a00: 6f 66 66 73 65 74 73 20 61 72 65 20 69 6e 20 72  offsets are in r
7a10: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ange */.    u8 *
7a20: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  pEnd;        /* 
7a30: 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f  Pointer to end o
7a40: 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72  f cell offset ar
7a50: 72 61 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61  ray */.    u8 ma
7a60: 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  sk;         /* M
7a70: 61 73 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74  ask of bits that
7a80: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e   must be zero in
7a90: 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66   MSB of cell off
7aa0: 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b  sets */.    mask
7ab0: 20 3d 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e   = ~(((u8)(pBt->
7ac0: 70 61 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29  pageSize>>8))-1)
7ad0: 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61  ;.    pEnd = &da
7ae0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
7af0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b  pPage->nCell*2];
7b00: 0a 20 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64  .    for(pOff=&d
7b10: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
7b20: 20 70 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21   pOff!=pEnd && !
7b30: 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20  ((*pOff)&mask); 
7b40: 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66  pOff+=2);.    if
7b50: 28 20 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a  ( pOff!=pEnd ){.
7b60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7b70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7b80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7b90: 69 66 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  if..    pPage->i
7ba0: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
7bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7bc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
7bd0: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
7be0: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
7bf0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
7c00: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
7c10: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
7c20: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
7c30: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
7c40: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
7c50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7c60: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
7c70: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
7c80: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
7c90: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
7ca0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
7cb0: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
7cc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7cd0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
7ce0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
7cf0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
7d00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7d10: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
7d20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7d30: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
7d40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7d50: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7d60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
7d70: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
7d80: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7d90: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
7da0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
7db0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7dc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7dd0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d  >mutex) );.  /*m
7de0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
7df0: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
7e00: 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20  Size - hdr);*/. 
7e10: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
7e20: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
7e30: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
7e40: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
7e50: 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65  )==0 ?1:0);.  me
7e60: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
7e70: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
7e80: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
7e90: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
7ea0: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
7eb0: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
7ec0: 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73  >nFree = pBt->us
7ed0: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
7ee0: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
7ef0: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
7f00: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7f10: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
7f20: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
7f30: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
7f40: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7f50: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
7f60: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
7f70: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37  t->pageSize<=327
7f80: 36 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  68 );.  pPage->m
7f90: 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70  askPage = pBt->p
7fa0: 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70  ageSize - 1;.  p
7fb0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
7fc0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
7fd0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
7fe0: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
7ff0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
8000: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
8010: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
8020: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
8030: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
8040: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
8050: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
8060: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
8070: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
8080: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
8090: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
80a0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
80b0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
80c0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
80d0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
80e0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
80f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
8100: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
8110: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
8120: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
8130: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
8140: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
8150: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
8160: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
8170: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
8180: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
8190: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
81a0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
81b0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
81c0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
81d0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
81e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
81f0: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
8200: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8210: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
8220: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
8230: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
8240: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
8250: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
8260: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
8270: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
8280: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
8290: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
82a0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
82b0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
82c0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
82d0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
82e0: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
82f0: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
8300: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
8310: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
8320: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
8330: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
8340: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
8350: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
8360: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
8370: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
8380: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
8390: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
83a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
83b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
83c0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
83d0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
83e0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
83f0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
8400: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
8410: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  eter */.  int no
8420: 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f  Content        /
8430: 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61  * Do not load pa
8440: 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ge content if tr
8450: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
8460: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
8470: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
8480: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8490: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
84a0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
84b0: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
84c0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
84d0: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
84e0: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
84f0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
8500: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
8510: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
8520: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
8530: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
8540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8550: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8560: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
8570: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
8580: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
8590: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
85a0: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
85b0: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
85c0: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
85d0: 67 6e 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75  gno pagerPagecou
85e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
85f0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  ){.  int nPage =
8600: 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   -1;.  int rc;. 
8610: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
8620: 61 67 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73  age1 );.  rc = s
8630: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
8640: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
8650: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73  , &nPage);.  ass
8660: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
8670: 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20  OK || nPage==-1 
8680: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e  );.  return (Pgn
8690: 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  o)nPage;.}../*.*
86a0: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
86b0: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
86c0: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
86d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
86e0: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
86f0: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
8700: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
8710: 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
8720: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
8730: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
8740: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  InitPage()..*/.s
8750: 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
8760: 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
8770: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
8780: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
8790: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
87a0: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
87b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
87c0: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
87d0: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
87e0: 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69  pPage     /* Wri
87f0: 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
8800: 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ter here */.){. 
8810: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
8820: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 4d 65  e *pDbPage;.  Me
8830: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
8840: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8850: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8860: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8870: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
8880: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8890: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
88a0: 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74  ..  /* It is oft
88b0: 65 6e 20 74 68 65 20 63 61 73 65 20 74 68 61 74  en the case that
88c0: 20 74 68 65 20 70 61 67 65 20 77 65 20 77 61 6e   the page we wan
88d0: 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
88e0: 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73  cache..  ** If s
88f0: 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65 63 74  o, get it direct
8900: 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65 73 20  ly.  This saves 
8910: 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74  us from having t
8920: 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65  o call.  ** page
8930: 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20  rPagecount() to 
8940: 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69  make sure pgno i
8950: 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c  s within limits,
8960: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20   which results. 
8970: 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65   ** in a measure
8980: 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  able performance
8990: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20   improvements.. 
89a0: 20 2a 2f 0a 20 20 70 44 62 50 61 67 65 20 3d 20   */.  pDbPage = 
89b0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
89c0: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
89d0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
89e0: 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50  Page ){.    /* P
89f0: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
8a00: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 2a  n cache */.    *
8a10: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d  ppPage = pPage =
8a20: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
8a30: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
8a40: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63  no, pBt);.    rc
8a50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50 61  }else{.    /* Pa
8a70: 67 65 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  ge not in cache.
8a80: 20 20 41 63 71 75 69 72 65 20 69 74 2e 20 2a 2f    Acquire it. */
8a90: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 61  .    if( pgno>pa
8aa0: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
8ab0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8ac0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
8ad0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
8ae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8af0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
8b00: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  pgno, ppPage, 0)
8b10: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
8b20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
8b30: 61 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20  age = *ppPage;. 
8b40: 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
8b50: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72  >isInit ){.    r
8b60: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
8b70: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
8b80: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
8b90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8ba0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
8bb0: 65 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  e);.    *ppPage 
8bc0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8bd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8be0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
8bf0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
8c00: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
8c10: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
8c20: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
8c30: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
8c40: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
8c50: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
8c60: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
8c70: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
8c80: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
8c90: 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  flow==0 || sqlit
8ca0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
8cb0: 75 6e 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61  unt(pPage->pDbPa
8cc0: 67 65 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73  ge)>1 );.    ass
8cd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
8ce0: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
8cf0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
8d00: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8d10: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
8d20: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8d30: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
8d40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
8d50: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
8d60: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
8d70: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
8d80: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8d90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8da0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
8db0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
8dc0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8dd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
8de0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
8df0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
8e00: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
8e10: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
8e20: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
8e30: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
8e40: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
8e50: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
8e60: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
8e70: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
8e80: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
8e90: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
8ea0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
8eb0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
8ec0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
8ed0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
8ee0: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
8ef0: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
8f00: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
8f10: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
8f20: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
8f30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8f40: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
8f50: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
8f60: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
8f70: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
8f80: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
8f90: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
8fa0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
8fb0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
8fc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8fd0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8fe0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
8ff0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
9000: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9010: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
9020: 74 28 70 44 61 74 61 29 3e 30 20 29 7b 0a 20 20  t(pData)>0 ){.  
9030: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
9040: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
9050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9060: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
9070: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
9080: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
9090: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
90a0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
90b0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
90c0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
90d0: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
90e0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
90f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
9100: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9110: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
9120: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
9130: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
9140: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
9150: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
9160: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
9170: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
9180: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
9190: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
91a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
91b0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
91c0: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
91d0: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
91e0: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
91f0: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
9200: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
9210: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
9220: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
9230: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
9240: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
9250: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
9260: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
9270: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
9280: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
9290: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
92a0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
92b0: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
92c0: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
92d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
92e0: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
92f0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
9300: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
9310: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9320: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
9330: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
9340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9350: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
9360: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
9370: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
9380: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9390: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
93a0: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
93b0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
93c0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
93d0: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
93e0: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
93f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
9400: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
9410: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
9420: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
9430: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
9440: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46  ;      /* The VF
9450: 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
9460: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53  s btree */.  BtS
9470: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
9480: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
9490: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
94a0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
94b0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
94c0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
94d0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
94e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
94f0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 0a  .  u8 nReserve;.
9500: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9510: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a  zDbHeader[100];.
9520: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
9530: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
9540: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
9550: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
9560: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
9570: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
9580: 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  d database. This
9590: 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20   symbol is only 
95a0: 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a  required if.  **
95b0: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73   either of the s
95c0: 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75  hared-data or au
95d0: 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65  tovacuum feature
95e0: 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a  s are compiled .
95f0: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69    ** into the li
9600: 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  brary..  */.#if 
9610: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9620: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
9630: 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  E) || !defined(S
9640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9650: 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20  ACUUM).  #ifdef 
9660: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
9670: 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69  RYDB.    const i
9680: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
9690: 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73    #else.    cons
96a0: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
96b0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74  zFilename && !st
96c0: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
96d0: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23  ":memory:");.  #
96e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
96f0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
9700: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9710: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
9720: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
9730: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
9740: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
9750: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
9760: 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
9770: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9780: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9790: 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
97a0: 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
97b0: 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21  >db = db;..#if !
97c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
97d0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
97e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
97f0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
9800: 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
9810: 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
9820: 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
9830: 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
9840: 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
9850: 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
9860: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
9870: 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
9880: 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64   */.  if( isMemd
9890: 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e  b==0.   && (db->
98a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
98b0: 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46  tab)==0.   && zF
98c0: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
98d0: 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20  name[0].  ){.   
98e0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
98f0: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
9900: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
9910: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
9920: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
9930: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
9940: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
9950: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
9960: 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  Malloc(nFullPath
9970: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
9980: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
9990: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
99a0: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
99b0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
99c0: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64  |= SQLITE_Shared
99d0: 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28  Cache;.      if(
99e0: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
99f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9a00: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
9a10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9a20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
9a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
9a40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
9a50: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
9a60: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
9a70: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
9a80: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
9a90: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
9aa0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9ab0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
9ac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9ad0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
9ae0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f  hared);.      fo
9af0: 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
9b00: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
9b10: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
9b20: 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
9b30: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
9b40: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
9b50: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
9b60: 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
9b70: 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
9b80: 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
9b90: 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20  Bt->pPager)).   
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
9bb0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
9bc0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
9bd0: 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
9be0: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
9bf0: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
9c00: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
9c10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
9c20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9c30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9c40: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
9c50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
9c60: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
9c70: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
9c80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9c90: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
9ca0: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
9cb0: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
9cc0: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
9cd0: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
9ce0: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
9cf0: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
9d00: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
9d10: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
9d20: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
9d30: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
9d40: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
9d50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9d60: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
9d70: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
9d80: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
9d90: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
9da0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
9db0: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
9dc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
9dd0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
9de0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
9df0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
9e00: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
9e10: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
9e20: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
9e30: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
9e40: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
9e50: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
9e60: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
9e70: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
9e80: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
9e90: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
9ea0: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
9eb0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
9ec0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
9ed0: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
9ee0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9ef0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
9f00: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
9f10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9f20: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
9f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9f40: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
9f50: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
9f60: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
9f70: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
9f80: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
9f90: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
9fa0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
9fb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9fc0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
9fd0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
9fe0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
9ff0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
a000: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
a010: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
a020: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
a040: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
a050: 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  vfsFlags);.    i
a060: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a070: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
a080: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
a090: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
a0a0: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
a0b0: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
a0c0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
a0d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a0e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
a0f0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
a100: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
a110: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
a120: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
a130: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
a140: 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
a150: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
a160: 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61    .    sqlite3Pa
a170: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70  gerSetReiniter(p
a180: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
a190: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74  Reinit);.    pBt
a1a0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
a1b0: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
a1c0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
a1d0: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
a1e0: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
a1f0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
a200: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
a210: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
a220: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69  ader[16]);.    i
a230: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
a240: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
a250: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
a260: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
a270: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
a280: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
a290: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
a2a0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
a2b0: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ze = 0;.      sq
a2c0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
a2d0: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
a2e0: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
a2f0: 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
a300: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
a310: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
a320: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
a330: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
a340: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
a350: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
a360: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
a370: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
a380: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
a390: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
a3a0: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
a3b0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
a3c0: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
a3d0: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
a3e0: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
a3f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
a400: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
a410: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
a420: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
a430: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
a440: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
a450: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
a460: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
a470: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
a480: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
a490: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
a4a0: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
a4b0: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
a4c0: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
a4d0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
a4e0: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
a4f0: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
a500: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
a510: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
a520: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
a530: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
a540: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
a550: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
a560: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
a570: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
a580: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
a590: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
a5a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a5b0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
a5c0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
a5d0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
a5e0: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
a5f0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
a600: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
a610: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
a620: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
a630: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
a640: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61    }.    pBt->usa
a650: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
a660: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
a670: 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
a680: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
a690: 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
a6a0: 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
a6b0: 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
a6c0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
a6d0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
a6e0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
a6f0: 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20  eSize);.   .#if 
a700: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a710: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
a720: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
a730: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
a740: 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
a750: 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
a760: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
a770: 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
a780: 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
a790: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
a7a0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
a7b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
a7c0: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
a7d0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
a7e0: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
a7f0: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
a800: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
a810: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
a820: 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  ER);.      if( S
a830: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
a840: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
a850: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
a860: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
a870: 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
a880: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
a890: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
a8a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
a8b0: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
a8c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
a8d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
a8e0: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
a8f0: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  ailed = 0;.     
a900: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
a910: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
a920: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a930: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a940: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
a950: 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
a960: 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
a970: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
a980: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
a990: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
a9a0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
a9b0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
a9c0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
a9d0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a9e0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a9f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
aa00: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
aa10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
aa20: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
aa30: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
aa40: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
aa50: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
aa60: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
aa70: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
aa80: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
aa90: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
aaa0: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
aab0: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
aac0: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
aad0: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
aae0: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
aaf0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
ab00: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
ab10: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
ab20: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
ab30: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
ab40: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
ab50: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ab60: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
ab70: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
ab80: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
ab90: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
aba0: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
abb0: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
abc0: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
abd0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
abe0: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
abf0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
ac00: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
ac10: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
ac20: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
ac30: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
ac40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ac50: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
ac60: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
ac70: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
ac80: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
ac90: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
aca0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
acb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
acc0: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
acd0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
ace0: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
acf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
ad00: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
ad10: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
ad20: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
ad30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ad40: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
ad50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ad60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ad70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
ad80: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
ad90: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
ada0: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
adb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
adc0: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
add0: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
ade0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
adf0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
ae00: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ae10: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
ae20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
ae30: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
ae40: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
ae50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
ae60: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
ae70: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
ae80: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
ae90: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
aea0: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
aeb0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
aec0: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
aed0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
aee0: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
aef0: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
af00: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
af10: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
af20: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
af30: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
af40: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
af50: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
af60: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
af70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
af80: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
af90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
afa0: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
afb0: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
afc0: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
afd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
afe0: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
aff0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b000: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
b010: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
b020: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
b030: 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74  MASTER);.  sqlit
b040: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
b050: 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
b060: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
b070: 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
b080: 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
b090: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
b0a0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
b0b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
b0c0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
b0d0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
b0e0: 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
b0f0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
b100: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
b110: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
b120: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
b130: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
b140: 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
b150: 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
b160: 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
b170: 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
b180: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
b190: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
b1a0: 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
b1b0: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
b1c0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
b1d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
b1e0: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
b1f0: 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
b200: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
b210: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
b220: 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
b230: 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
b240: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
b250: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
b260: 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
b270: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
b280: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
b290: 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
b2a0: 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
b2b0: 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
b2c0: 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
b2d0: 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
b2e0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
b2f0: 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
b300: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
b310: 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
b320: 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
b330: 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
b340: 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
b350: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
b360: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
b370: 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
b380: 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
b390: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
b3a0: 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
b3b0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
b3c0: 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
b3d0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
b3e0: 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
b3f0: 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
b400: 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
b410: 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
b420: 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
b430: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
b440: 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
b450: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
b460: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
b470: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
b480: 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
b490: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
b4a0: 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
b4b0: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
b4c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b4d0: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
b4e0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
b4f0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
b500: 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
b510: 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
b520: 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
b530: 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
b540: 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
b550: 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
b560: 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
b570: 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
b580: 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
b590: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
b5a0: 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
b5b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
b5c0: 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
b5d0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
b5e0: 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
b5f0: 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
b600: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
b610: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
b620: 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
b630: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
b640: 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
b650: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
b660: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29  BtreeRollback(p)
b670: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
b680: 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
b690: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
b6a0: 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
b6b0: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
b6c0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
b6d0: 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
b6e0: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
b6f0: 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
b700: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
b710: 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
b720: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
b730: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b740: 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
b750: 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
b760: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
b770: 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
b780: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
b790: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
b7a0: 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
b7b0: 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
b7c0: 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
b7d0: 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
b7e0: 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
b7f0: 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
b800: 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
b810: 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
b820: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
b830: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
b840: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
b850: 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
b860: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
b870: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
b880: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
b890: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
b8a0: 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
b8b0: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
b8c0: 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
b8d0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
b8e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
b8f0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
b900: 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
b910: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
b920: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
b930: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
b940: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
b950: 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
b960: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
b970: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
b980: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
b990: 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
b9a0: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
b9b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
b9c0: 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
b9d0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
b9e0: 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
b9f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ba00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ba10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
ba20: 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
ba30: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
ba40: 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
ba50: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
ba60: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
ba70: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
ba80: 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
ba90: 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
baa0: 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
bab0: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
bac0: 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
bad0: 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
bae0: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
baf0: 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
bb00: 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
bb10: 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
bb20: 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
bb30: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
bb40: 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
bb50: 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
bb60: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
bb70: 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
bb80: 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
bb90: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
bba0: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
bbb0: 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
bbc0: 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
bbd0: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
bbe0: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
bbf0: 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
bc00: 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
bc10: 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
bc20: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
bc30: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
bc40: 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
bc50: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
bc60: 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
bc70: 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
bc80: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
bc90: 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
bca0: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
bcb0: 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
bcc0: 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
bcd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
bce0: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
bcf0: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
bd00: 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
bd10: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
bd20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bd30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
bd40: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
bd50: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
bd60: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
bd70: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
bd80: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
bd90: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
bda0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
bdb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bdc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
bdd0: 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
bde0: 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
bdf0: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
be00: 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
be10: 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
be20: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
be30: 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
be40: 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
be50: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
be60: 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
be70: 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
be80: 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
be90: 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
bea0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
beb0: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
bec0: 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
bed0: 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
bee0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
bef0: 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
bf00: 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
bf10: 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
bf20: 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
bf30: 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
bf40: 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
bf50: 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
bf60: 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
bf70: 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
bf80: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
bf90: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
bfa0: 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
bfb0: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
bfc0: 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
bfd0: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
bfe0: 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
bff0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
c000: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
c010: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c020: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
c030: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
c040: 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
c050: 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
c060: 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65  Level(pBt->pPage
c070: 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79  r, level, fullSy
c080: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nc);.  sqlite3Bt
c090: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
c0a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c0b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c0c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
c0d0: 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
c0e0: 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
c0f0: 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
c100: 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
c110: 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
c120: 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
c130: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
c140: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c150: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
c160: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
c170: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
c180: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
c190: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c1a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
c1b0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  db->mutex) );  .
c1c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c1d0: 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
c1e0: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
c1f0: 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
c200: 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
c210: 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
c220: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c230: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
c240: 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66   rc;.}..#if !def
c250: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c260: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
c270: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
c280: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
c290: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
c2a0: 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
c2b0: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
c2c0: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
c2d0: 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
c2e0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
c2f0: 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
c300: 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
c310: 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
c320: 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
c330: 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
c340: 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
c350: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
c360: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
c370: 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
c380: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
c390: 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
c3a0: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
c3b0: 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
c3c0: 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
c3d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c3e0: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
c3f0: 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
c400: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
c410: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
c420: 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
c430: 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
c440: 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
c450: 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
c460: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
c470: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
c480: 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
c490: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
c4a0: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
c4b0: 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
c4c0: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
c4d0: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
c4e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c4f0: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
c500: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
c510: 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
c520: 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
c530: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c540: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
c550: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
c560: 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
c570: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
c580: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
c590: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
c5a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
c5b0: 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
c5c0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c5d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c5e0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
c5f0: 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
c600: 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
c610: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
c620: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
c630: 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
c640: 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
c650: 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
c660: 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
c670: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
c680: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
c690: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
c6a0: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
c6b0: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
c6c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
c6d0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
c6e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
c6f0: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
c700: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
c710: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c720: 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a  e = (u16)pageSiz
c730: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
c740: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72  pace(pBt);.    r
c750: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c760: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
c770: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
c780: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
c790: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c7a0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c7b0: 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
c7c0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c7d0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
c7e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
c7f0: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
c800: 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
c810: 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
c820: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
c830: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
c840: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
c850: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74  >pageSize;.}.int
c860: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
c870: 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
c880: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
c890: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c8a0: 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
c8b0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
c8c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
c8d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c8e0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
c8f0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
c900: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
c910: 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
c920: 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
c930: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
c940: 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
c950: 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
c960: 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
c970: 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
c980: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
c990: 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
c9a0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
c9b0: 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
c9c0: 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
c9d0: 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
c9e0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
c9f0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
ca00: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
ca10: 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
ca20: 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
ca30: 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
ca40: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
ca50: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
ca60: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e   return n;.}.#en
ca70: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ca80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
ca90: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
caa0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
cab0: 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
cac0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
cad0: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
cae0: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
caf0: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
cb00: 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
cb10: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
cb20: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
cb30: 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
cb40: 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
cb50: 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
cb60: 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
cb70: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
cb80: 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
cb90: 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
cba0: 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
cbb0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
cbc0: 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
cbd0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
cbe0: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
cbf0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
cc00: 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
cc10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
cc20: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
cc30: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
cc40: 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
cc50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
cc60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cc70: 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
cc80: 20 61 75 74 6f 56 61 63 75 75 6d 20 3f 31 3a 30   autoVacuum ?1:0
cc90: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
cca0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
ccb0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
ccc0: 78 65 64 20 26 26 20 61 76 21 3d 70 42 74 2d 3e  xed && av!=pBt->
ccd0: 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
cce0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
ccf0: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
cd00: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
cd10: 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20  cuum = av;.  }. 
cd20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
cd30: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
cd40: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
cd50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
cd60: 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
cd70: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
cd80: 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
cd90: 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
cda0: 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
cdb0: 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
cdc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
cdd0: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
cde0: 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
cdf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ce00: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
ce10: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
ce20: 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
ce30: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
ce40: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
ce50: 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
ce60: 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
ce70: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
ce80: 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
ce90: 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
cea0: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
ceb0: 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
cec0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
ced0: 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
cee0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
cef0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
cf00: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
cf10: 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
cf20: 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
cf30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
cf40: 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
cf50: 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
cf60: 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
cf70: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
cf80: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
cf90: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
cfa0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
cfb0: 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
cfc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cfd0: 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
cfe0: 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
cff0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
d000: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
d010: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
d020: 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
d030: 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
d040: 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
d050: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
d060: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
d070: 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
d080: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
d090: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
d0a0: 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
d0b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d0c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d0d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
d0e0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
d0f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d100: 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  K;.  rc = sqlite
d110: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
d120: 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
d130: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d140: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
d150: 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
d160: 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
d170: 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
d180: 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
d190: 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
d1a0: 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
d1b0: 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
d1c0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d1d0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
d1e0: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
d1f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d200: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
d210: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
d220: 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65   }else if( nPage
d230: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61  >0 ){.    int pa
d240: 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  geSize;.    int 
d250: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
d260: 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
d270: 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
d280: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
d290: 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
d2a0: 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
d2b0: 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
d2c0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
d2d0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
d2e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
d2f0: 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
d300: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
d310: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
d320: 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
d330: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
d340: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
d350: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
d360: 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
d370: 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
d380: 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
d390: 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
d3a0: 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
d3b0: 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
d3c0: 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
d3d0: 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
d3e0: 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
d3f0: 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
d400: 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
d410: 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
d420: 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
d430: 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
d440: 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
d450: 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
d460: 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
d470: 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
d480: 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
d490: 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
d4a0: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d4b0: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d4c0: 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
d4d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67   = get2byte(&pag
d4e0: 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  e1[16]);.    if(
d4f0: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
d500: 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70  ageSize)!=0 || p
d510: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20  ageSize<512 ||. 
d520: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d         (SQLITE_M
d530: 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37  AX_PAGE_SIZE<327
d540: 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53  68 && pageSize>S
d550: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
d560: 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  IZE).    ){.    
d570: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d580: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
d590: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
d5a0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
d5b0: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
d5c0: 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
d5d0: 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
d5e0: 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
d5f0: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
d600: 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
d610: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
d620: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d630: 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
d640: 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
d650: 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
d660: 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
d670: 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
d680: 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
d690: 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
d6a0: 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
d6b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
d6c0: 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
d6d0: 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
d6e0: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
d6f0: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
d700: 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
d710: 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
d720: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
d730: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
d740: 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
d750: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
d760: 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
d770: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
d780: 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a  = (u16)usableSiz
d790: 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
d7a0: 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
d7b0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
d7c0: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
d7d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
d7e0: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
d7f0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
d800: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
d810: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d820: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
d830: 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35  if( usableSize<5
d840: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
d850: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
d860: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
d870: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
d880: 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  16)pageSize;.   
d890: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
d8a0: 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69   = (u16)usableSi
d8b0: 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
d8c0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d8d0: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
d8e0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
d8f0: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
d900: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
d910: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
d920: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
d930: 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
d940: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
d950: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
d960: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
d970: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
d980: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
d990: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
d9a0: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
d9b0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
d9c0: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
d9d0: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
d9e0: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
d9f0: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
da00: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
da10: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
da20: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
da30: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
da40: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
da50: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
da60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
da70: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
da80: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
da90: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
daa0: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
dab0: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
dac0: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
dad0: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
dae0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
daf0: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
db00: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
db10: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
db20: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
db30: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
db40: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
db50: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
db60: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
db70: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
db80: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
db90: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
dba0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
dbb0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
dbc0: 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
dbd0: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
dbe0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
dbf0: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
dc00: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
dc10: 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
dc20: 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
dc30: 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
dc40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
dc50: 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
dc60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
dc70: 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
dc80: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
dc90: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
dca0: 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
dcb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
dcc0: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
dcd0: 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
dce0: 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
dcf0: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
dd00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
dd10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
dd20: 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74  orks like lockBt
dd30: 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61  ree() except tha
dd40: 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65  t it also invoke
dd50: 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61  s the.** busy ca
dd60: 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20  llback if there 
dd70: 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
dd80: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
dd90: 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  t lockBtreeWithR
dda0: 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66  etry(Btree *pRef
ddb0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ddc0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
ddd0: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
dde0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29  HoldsMutex(pRef)
ddf0: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e   );.  if( pRef->
de00: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
de10: 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e  ONE ){.    u8 in
de20: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52  Transaction = pR
de30: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
de40: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65  action;.    btre
de50: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
de60: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
de70: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
de80: 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20  s(pRef, 0);.    
de90: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
dea0: 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61  nsaction = inTra
deb0: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52  nsaction;.    pR
dec0: 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  ef->inTrans = TR
ded0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66  ANS_NONE;.    if
dee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
def0: 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70  ){.      pRef->p
df00: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
df10: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  --;.    }.    bt
df20: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
df30: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
df40: 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a   rc;.}.       ..
df50: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
df60: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
df70: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
df80: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
df90: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
dfa0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
dfb0: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
dfc0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
dfd0: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
dfe0: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
dff0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
e000: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
e010: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
e020: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
e030: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
e040: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
e050: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
e060: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
e070: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
e080: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
e090: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
e0a0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
e0b0: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
e0c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e0d0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
e0e0: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
e0f0: 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
e100: 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
e110: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e120: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
e130: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
e140: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
e150: 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
e160: 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70  >pCursor==0 && p
e170: 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
e180: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
e190: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
e1a0: 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b  t->pPager)>=1 ){
e1b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e1c0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
e1d0: 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20  a );.#if 0.     
e1e0: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
e1f0: 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ->aData==0 ){.  
e200: 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
e210: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67  Page = pBt->pPag
e220: 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e1;.        pPag
e230: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
e240: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
e250: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
e260: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
e270: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
e280: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
e290: 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  1;.      }.#endi
e2a0: 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  f.      releaseP
e2b0: 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
e2c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
e2d0: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
e2e0: 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
e2f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
e300: 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61  reate a new data
e310: 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
e320: 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
e330: 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  age of the.** fi
e340: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
e350: 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
e360: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
e370: 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
e380: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
e390: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ata;.  int rc;. 
e3a0: 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
e3b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e3c0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
e3d0: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
e3e0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
e3f0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
e400: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
e410: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e420: 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  || nPage>0 ){.  
e430: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e440: 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
e450: 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
e460: 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
e470: 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
e480: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e490: 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
e4a0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
e4b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
e4c0: 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
e4d0: 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
e4e0: 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
e4f0: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
e500: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
e510: 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74  =16 );.  put2byt
e520: 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74  e(&data[16], pBt
e530: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
e540: 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
e550: 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
e560: 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
e570: 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
e580: 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
e590: 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
e5a0: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
e5b0: 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
e5c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
e5d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
e5e0: 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
e5f0: 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
e600: 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
e610: 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
e620: 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
e630: 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
e640: 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
e650: 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
e660: 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
e670: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
e680: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
e690: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e6a0: 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
e6b0: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
e6c0: 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
e6d0: 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
e6e0: 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
e6f0: 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
e700: 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
e710: 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
e720: 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
e730: 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
e740: 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
e750: 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
e760: 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
e770: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e780: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
e790: 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
e7a0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
e7b0: 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
e7c0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
e7d0: 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
e7e0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
e7f0: 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
e800: 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
e810: 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
e820: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
e830: 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
e840: 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
e850: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
e860: 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
e870: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
e880: 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
e890: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
e8a0: 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
e8b0: 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
e8c0: 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
e8d0: 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
e8e0: 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
e8f0: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
e900: 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
e910: 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
e920: 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
e930: 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
e940: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
e950: 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
e960: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
e970: 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
e980: 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
e990: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
e9a0: 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
e9b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e9c0: 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
e9d0: 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
e9e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
e9f0: 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
ea00: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
ea10: 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
ea20: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
ea30: 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
ea40: 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
ea50: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
ea60: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
ea70: 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
ea80: 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
ea90: 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
eaa0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
eab0: 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
eac0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
ead0: 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
eae0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
eaf0: 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
eb00: 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
eb10: 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
eb20: 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
eb30: 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
eb40: 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
eb50: 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
eb60: 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
eb70: 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
eb80: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
eb90: 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
eba0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
ebb0: 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
ebc0: 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
ebd0: 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
ebe0: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
ebf0: 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
ec00: 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
ec10: 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
ec20: 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
ec30: 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
ec40: 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
ec50: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
ec60: 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
ec70: 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
ec80: 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
ec90: 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
eca0: 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
ecb0: 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
ecc0: 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
ecd0: 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
ece0: 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
ecf0: 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
ed00: 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
ed10: 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
ed20: 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
ed30: 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
ed40: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
ed50: 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
ed60: 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
ed70: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
ed80: 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
ed90: 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
eda0: 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
edb0: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
edc0: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
edd0: 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
ede0: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
edf0: 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
ee00: 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
ee10: 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
ee20: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ee30: 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
ee40: 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
ee50: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
ee60: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
ee70: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ee80: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
ee90: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
eea0: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
eeb0: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
eec0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
eed0: 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
eee0: 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
eef0: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
ef00: 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
ef10: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
ef20: 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
ef30: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
ef40: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
ef50: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
ef60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
ef70: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
ef80: 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
ef90: 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
efa0: 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
efb0: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
efc0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
efd0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
efe0: 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
eff0: 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
f000: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
f010: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
f020: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
f030: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
f040: 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
f050: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
f060: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  ..  /* If anothe
f070: 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
f080: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
f090: 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
f0a0: 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
f0b0: 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
f0c0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
f0d0: 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
f0e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
f0f0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
f100: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f110: 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  SY..  */.  if( p
f120: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f130: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
f140: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
f150: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
f160: 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
f170: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
f180: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f190: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
f1a0: 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
f1b0: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
f1c0: 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
f1d0: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
f1e0: 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
f1f0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
f200: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
f210: 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=p ){.        r
f220: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f230: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74 72  .        goto tr
f240: 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20  ans_begun;.     
f250: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
f260: 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20  dif..  do {.    
f270: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
f280: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  =0 ){.      do{.
f290: 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63          rc = loc
f2a0: 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20  kBtree(pBt);.   
f2b0: 20 20 20 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e     }while( pBt->
f2c0: 70 50 61 67 65 31 3d 3d 30 20 26 26 20 72 63 3d  pPage1==0 && rc=
f2d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
f2e0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
f2f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
f300: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
f310: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
f320: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f330: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
f340: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f350: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f360: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
f370: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
f380: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
f390: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f3a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f3b0: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
f3c0: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
f3d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f3e0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
f3f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f400: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
f410: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
f420: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
f430: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
f440: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
f450: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
f460: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
f470: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
f480: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
f490: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
f4a0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
f4b0: 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
f4c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f4d0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
f4e0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
f4f0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
f500: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
f510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
f520: 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
f530: 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
f540: 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
f550: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
f560: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
f570: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
f580: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
f590: 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
f5a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f5b0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
f5c0: 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e  .    if( wrflag>
f5d0: 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  1 ){.      asser
f5e0: 74 28 20 21 70 42 74 2d 3e 70 45 78 63 6c 75 73  t( !pBt->pExclus
f5f0: 69 76 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ive );.      pBt
f600: 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20 70  ->pExclusive = p
f610: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f620: 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
f630: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
f640: 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
f650: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
f660: 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
f670: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
f680: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
f690: 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
f6a0: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
f6b0: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
f6c0: 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
f6d0: 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
f6e0: 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
f6f0: 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
f700: 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
f710: 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
f720: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
f730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f740: 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
f750: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
f760: 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
f770: 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
f780: 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
f790: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
f7a0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
f7b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f7c0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f7d0: 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
f7e0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
f7f0: 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
f800: 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
f810: 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
f820: 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
f830: 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
f840: 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
f850: 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
f860: 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
f870: 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
f880: 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
f890: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
f8a0: 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
f8b0: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
f8c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
f8f0: 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
f900: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f930: 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
f940: 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
f950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f970: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
f980: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f990: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
f9a0: 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
f9b0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
f9c0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
f9d0: 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
f9e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f9f0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
fa00: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
fa10: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
fa20: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
fa30: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fa40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
fa50: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
fa60: 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
fa70: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
fa80: 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
fa90: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
faa0: 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
fab0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
fac0: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
fad0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
fae0: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
faf0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fb00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
fb10: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
fb20: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
fb30: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
fb40: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
fb50: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
fb60: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
fb70: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
fb80: 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
fb90: 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
fba0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
fbb0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fbc0: 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
fbd0: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
fbe0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
fbf0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
fc00: 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
fc10: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
fc20: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
fc30: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
fc40: 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
fc50: 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
fc60: 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
fc70: 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
fc80: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
fc90: 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
fca0: 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
fcb0: 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
fcc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
fcd0: 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68  ere on pPage, wh
fce0: 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65  ich is guarentee
fcf0: 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20  d to be a btree 
fd00: 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65  page, not an ove
fd10: 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69  rflow.** page, i
fd20: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
fd30: 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66  age iFrom. Modif
fd40: 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
fd50: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
fd60: 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61   to.** iTo. Para
fd70: 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
fd80: 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
fd90: 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  f pointer to be 
fda0: 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a  modified, as .**
fdb0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
fdc0: 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
fdd0: 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
fde0: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
fdf0: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
fe00: 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
fe20: 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
fe30: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
fe40: 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
fe50: 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
fe60: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
fe70: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
fea0: 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
feb0: 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
fec0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
fed0: 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
fee0: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
fef0: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
ff00: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
ff10: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
ff20: 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
ff30: 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
ff40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ff50: 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
ff60: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
ff70: 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
ff80: 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
ff90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
ffa0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ffb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
ffc0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
ffd0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
ffe0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
fff0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
10000 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
10010 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
10020 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
10030 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
10040 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
10050 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
10060 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
10070 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
10080 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
10090 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
100a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
100b0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  PT;.    }.    pu
100c0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
100d0 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c  ata, iTo);.  }el
100e0 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69  se{.    u8 isIni
100f0 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
10100 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69  sInit;.    int i
10110 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
10120 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ..    sqlite3Btr
10130 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
10140 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
10150 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
10160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
10170 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
10180 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
10190 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
101a0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
101b0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
101c0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
101d0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
101e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
101f0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
10200 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
10210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
10220 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
10230 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
10240 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
10250 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
10260 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20  flow]) ){.      
10270 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
10280 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
10290 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
102a0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
102b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
102c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
102d0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
102e0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
102f0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
10300 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
10310 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
10320 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10330 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10340 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
10350 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
10360 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
10370 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
10380 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
10390 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
103a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
103b0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
103c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
103d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
103e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
103f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
10400 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
10410 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
10420 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
10430 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
10440 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
10450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10460 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
10470 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
10480 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
10490 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
104a0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
104b0 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
104c0 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
104d0 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
104e0 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
104f0 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
10500 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
10510 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
10520 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
10530 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
10540 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
10550 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10570 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
10580 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
10590 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
105a0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
105b0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
105c0 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
105d0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
105e0 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
105f0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
10600 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
10610 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
10620 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
10630 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
10640 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
10650 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
10660 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
10670 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
10680 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
10690 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
106a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
106b0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
106c0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
106d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
106e0 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
106f0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
10700 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
10710 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
10720 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
10730 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
10740 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10750 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10760 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
10770 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
10780 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
10790 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
107a0 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
107b0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
107c0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
107d0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
107e0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
107f0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
10800 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
10810 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
10820 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
10830 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
10840 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
10850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10860 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
10870 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
10880 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
10890 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
108a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
108b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
108c0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
108d0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
108e0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
108f0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
10900 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
10910 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
10920 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
10930 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
10940 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
10950 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
10960 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
10970 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
10980 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
10990 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
109a0 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
109b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
109c0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
109d0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
109e0 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
109f0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
10a00 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
10a10 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
10a20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
10a30 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
10a40 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
10a50 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
10a60 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
10a70 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
10a80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
10a90 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
10aa0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
10ab0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
10ac0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
10ad0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
10ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10af0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10b00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
10b10 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
10b20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
10b30 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
10b40 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
10b50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
10b60 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
10b70 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
10b80 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
10b90 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
10ba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10bb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
10bc0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
10bd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
10be0 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
10bf0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
10c00 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
10c10 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
10c20 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
10c30 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
10c40 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
10c50 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
10c60 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
10c70 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
10c80 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
10c90 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
10ca0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
10cb0 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
10cc0 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
10cd0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
10ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10cf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10d00 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
10d10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
10d20 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
10d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
10d60 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
10d70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10d80 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
10d90 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
10da0 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
10db0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
10dc0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
10dd0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
10de0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10df0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
10e00 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
10e10 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
10e20 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20   iPtrPage);.    
10e30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
10e40 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
10e50 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
10e60 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
10e70 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
10e80 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
10e90 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
10ea0 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
10eb0 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
10ec0 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
10ed0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
10ee0 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
10ef0 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
10f00 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
10f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
10f20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
10f30 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
10f40 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20  therefore no.** 
10f50 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67  point in calling
10f60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
10f70 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
10f80 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
10f90 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
10fa0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
10fb0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
10fc0 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20  rganize the .** 
10fd0 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
10fe0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
10ff0 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
11000 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69  ntly in use.** i
11010 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
11020 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
11030 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20   nFin parameter 
11040 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
11050 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11060 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20  assumes.** that 
11070 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
11080 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
11090 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
110a0 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e  til.** it return
110b0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
110c0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
110d0 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a  hat nFin is the.
110e0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
110f0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
11100 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  file will contai
11110 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a  n after this .**
11120 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70   process is comp
11130 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lete..*/.static 
11140 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
11150 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
11160 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
11170 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67  o iLastPg){.  Pg
11180 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
11190 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
111a0 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
111b0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
111c0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
111d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
111e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
111f0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
11200 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
11210 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
11220 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
11230 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
11240 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
11250 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
11260 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
11270 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
11280 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11290 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
112a0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
112b0 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74  0 || nFin==iLast
112c0 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  Pg ){.      retu
112d0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
112e0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
112f0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
11300 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
11310 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
11320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11330 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
11340 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
11350 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
11360 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
11370 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11380 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11390 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
113a0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
113b0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
113c0 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
113d0 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
113e0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
113f0 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
11400 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
11410 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
11420 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
11430 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
11440 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
11450 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
11460 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
11470 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
11480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11490 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
114a0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
114b0 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
114c0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
114d0 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
114e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
114f0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
11500 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
11510 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
11520 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
11530 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
11540 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
11550 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
11560 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11580 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11590 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
115a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
115b0 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
115c0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
115d0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
115e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
115f0 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
11600 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
11610 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
11620 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
11630 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
11640 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
11650 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
11660 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
11670 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
11680 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
11690 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
116a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
116b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
116c0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
116d0 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
116e0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
116f0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
11700 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
11710 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
11720 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
11730 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
11740 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
11750 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
11760 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
11770 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
11780 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
11790 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
117a0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
117b0 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
117c0 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
117d0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
117e0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
117f0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
11800 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
11810 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
11820 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
11830 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
11840 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
11850 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
11860 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
11870 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
11880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
118a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
118b0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
118c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
118d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
118e0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
118f0 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
11900 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
11910 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
11920 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
11930 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
11940 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
11950 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
11960 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
11970 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
11980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11990 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
119a0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
119b0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
119c0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
119d0 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20  , nFin!=0);.    
119e0 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
119f0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
11a00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11a20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11a30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11a40 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29  .  if( nFin==0 )
11a50 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b  {.    iLastPg--;
11a60 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73  .    while( iLas
11a70 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
11a80 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52  E_PAGE(pBt)||PTR
11a90 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
11aa0 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20  iLastPg) ){.    
11ab0 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
11ac0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
11ad0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
11ae0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c  (pBt->pPager, iL
11af0 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  astPg);.  }.  re
11b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11b10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
11b20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
11b30 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
11b40 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
11b50 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
11b60 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
11b70 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
11b80 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
11b90 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
11ba0 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
11bb0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
11bc0 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
11bd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
11be0 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
11bf0 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
11c00 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
11c10 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
11c20 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a   error occured,.
11c30 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
11c40 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
11c50 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
11c60 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
11c70 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
11c80 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
11c90 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
11ca0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11cb0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
11cc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11cd0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
11ce0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  db;.  assert( pB
11cf0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11d00 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
11d10 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
11d20 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
11d30 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
11d40 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
11d50 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
11d60 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
11d70 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
11d80 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
11d90 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
11da0 70 28 70 42 74 2c 20 30 2c 20 73 71 6c 69 74 65  p(pBt, 0, sqlite
11db0 33 50 61 67 65 72 49 6d 61 67 65 53 69 7a 65 28  3PagerImageSize(
11dc0 70 42 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a 20  pBt->pPager));. 
11dd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
11de0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11df0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11e00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11e10 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
11e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
11e30 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
11e40 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
11e50 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
11e60 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
11e70 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
11e80 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11e90 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
11ea0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
11eb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
11ec0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
11ed0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
11ee0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
11ef0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
11f00 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
11f10 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
11f20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
11f30 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
11f40 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
11f50 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
11f60 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
11f70 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
11f80 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
11f90 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
11fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
11fb0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
11fc0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
11fd0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
11fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
11ff0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
12000 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
12010 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12020 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12030 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
12040 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
12050 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
12060 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
12070 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
12080 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
12090 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Fin;.    Pgno nF
120a0 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  ree;.    Pgno nP
120b0 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f 20  trmap;.    Pgno 
120c0 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74  iFree;.    const
120d0 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d   int pgsz = pBt-
120e0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 50  >pageSize;.    P
120f0 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67 65  gno nOrig = page
12100 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  rPagecount(pBt);
12110 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ..    if( PTRMAP
12120 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
12130 69 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ig) ){.      ret
12140 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12150 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
12160 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45     if( nOrig==PE
12170 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
12180 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 4f  pBt) ){.      nO
12190 72 69 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rig--;.    }.   
121a0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
121b0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
121c0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
121d0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
121e0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
121f0 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
12200 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35  +pgsz/5)/(pgsz/5
12210 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f  );.    nFin = nO
12220 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
12230 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e  trmap;.    if( n
12240 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
12250 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
12260 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
12270 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
12280 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
12290 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54   }.    while( PT
122a0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
122b0 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
122c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
122d0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
122e0 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20  nFin--;.    }.. 
122f0 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
12300 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
12310 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
12320 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
12330 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
12340 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
12350 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iFree);.    }.  
12360 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
12370 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
12380 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
12390 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
123a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
123b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
123c0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
123d0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
123e0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
123f0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
12400 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
12410 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
12420 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
12430 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  36], 0);.      s
12440 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
12450 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
12460 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  ager, nFin);.   
12470 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
12480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12490 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
124a0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
124b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
124c0 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
124d0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
124e0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
124f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
12500 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
12510 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12520 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  UM */../*.** Thi
12530 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
12540 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
12550 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
12560 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
12570 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
12580 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12590 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
125a0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
125b0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
125c0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
125d0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
125e0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
125f0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
12600 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
12610 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
12620 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
12630 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
12640 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
12650 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
12660 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
12670 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
12680 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
12690 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
126a0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
126b0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
126c0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
126d0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
126e0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
126f0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
12700 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
12710 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
12720 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
12730 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
12740 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
12750 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
12760 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
12770 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
12780 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
12790 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
127a0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
127b0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
127c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
127d0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
127e0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
127f0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
12800 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
12810 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
12820 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
12830 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
12840 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
12850 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
12860 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
12870 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
12880 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
12890 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
128a0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
128b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
128c0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
128d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
128e0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
128f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
12900 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
12910 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
12920 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
12930 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
12940 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
12950 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
12960 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
12970 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
12980 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
12990 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
129a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
129b0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
129c0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
129d0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
129e0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
129f0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
12a00 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
12a10 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
12a20 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
12a30 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
12a40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
12a50 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
12a60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
12a70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12a80 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
12a90 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
12aa0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
12ab0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12ac0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
12ad0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
12ae0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
12af0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12b00 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
12b10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
12b20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
12b30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12b40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12b50 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
12b60 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
12b70 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
12b80 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
12b90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12bb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12bc0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
12bd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12be0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
12bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12c00 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
12c10 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
12c20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
12c30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12c40 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
12c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12c60 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
12c70 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
12c80 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
12c90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12ca0 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
12cb0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
12cc0 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
12cd0 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
12ce0 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
12cf0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
12d00 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
12d10 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
12d20 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
12d30 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
12d40 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
12d50 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
12d60 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68  ne did.** all th
12d70 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
12d80 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
12d90 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
12da0 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
12db0 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
12dc0 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
12dd0 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
12de0 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
12df0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
12e00 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
12e10 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
12e20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12e30 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65  .** (which cause
12e40 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
12e50 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
12e60 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
12e70 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
12e80 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
12e90 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
12ea0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
12eb0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
12ec0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
12ed0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
12ee0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
12ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12f00 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
12f10 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
12f20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
12f30 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
12f40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12f50 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
12f60 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
12f70 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
12f80 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
12f90 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
12fa0 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
12fb0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
12fc0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
12fd0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
12fe0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
12ff0 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
13000 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
13010 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
13020 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
13030 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
13040 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13050 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
13060 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
13070 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
13080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13090 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
130a0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
130b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
130c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
130d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
130e0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
130f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
13100 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13110 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
13120 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  ;.    pBt->inStm
13130 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c  t = 0;.  }.  unl
13140 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
13150 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
13160 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e  ndle has any kin
13170 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
13180 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
13190 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
131a0 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74  .  ** count of t
131b0 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
131c0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
131d0 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65  ion count reache
131e0 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68  s 0, set.  ** th
131f0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
13200 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
13210 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
13220 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c  nused() call bel
13230 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c  ow.  ** will unl
13240 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20  ock the pager.. 
13250 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
13260 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
13270 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   ){.    pBt->nTr
13280 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
13290 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
132a0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
132b0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
132c0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
132d0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
132e0 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61 6e 64   /* Set the hand
132f0 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72 61 6e  les current tran
13300 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
13310 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
13320 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20  unlock.  ** the 
13330 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
13340 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
13350 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
13360 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
13370 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  */.  p->inTrans 
13380 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
13390 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
133a0 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
133b0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
133c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
133d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
133e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
133f0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
13400 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
13410 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13420 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
13430 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
13440 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13450 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
13460 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
13470 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
13480 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
134a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
134b0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
134c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
134d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
134e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
134f0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
13500 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
13510 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
13520 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
13530 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
13540 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
13550 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
13560 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
13570 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
13580 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
13590 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
135a0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
135b0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
135c0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
135d0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
135e0 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
135f0 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
13600 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
13610 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
13620 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
13630 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
13640 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
13650 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
13660 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
13670 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
13680 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
13690 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
136a0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
136b0 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
136c0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
136d0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
136e0 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
136f0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
13700 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
13710 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
13720 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
13730 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
13740 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
13750 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
13760 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
13770 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13780 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
13790 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
137a0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
137b0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
137c0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
137d0 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
137e0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
137f0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
13800 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
13810 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
13820 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
13830 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
13840 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
13850 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
13860 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
13870 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
13880 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
13890 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
138a0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
138b0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
138c0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
138d0 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
138e0 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
138f0 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
13900 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
13910 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
13920 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
13930 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
13940 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
13950 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
13960 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
13970 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
13980 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
13990 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
139a0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
139b0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
139c0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
139d0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
139e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
139f0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
13a00 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
13a10 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
13a20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
13a30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13a40 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
13a50 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
13a60 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
13a70 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
13a80 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
13a90 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
13aa0 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
13ab0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
13ac0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65  .    p->skip = e
13ad0 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
13ae0 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
13af0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
13b00 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
13b10 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
13b20 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
13b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
13b40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13b50 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
13b60 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
13b70 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
13b80 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
13b90 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
13ba0 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
13bb0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
13bc0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
13bd0 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
13be0 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
13bf0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
13c00 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
13c10 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
13c20 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
13c30 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
13c40 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
13c50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
13c60 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
13c70 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
13c80 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
13c90 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
13ca0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
13cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
13cc0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
13cd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
13ce0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
13cf0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
13d00 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
13d10 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13d20 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13d30 64 62 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41  db;.  rc = saveA
13d40 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
13d50 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
13d60 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
13d70 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
13d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d90 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
13da0 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
13db0 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
13dc0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
13dd0 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
13de0 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
13df0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
13e00 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
13e10 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
13e20 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
13e30 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
13e40 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
13e50 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
13e60 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
13e70 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
13e80 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
13e90 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
13ea0 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
13eb0 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
13ec0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
13ed0 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
13ee0 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
13ef0 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
13f00 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
13f10 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
13f20 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
13f30 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
13f40 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
13f50 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
13f60 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
13f70 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20  rsors(p, rc);.  
13f80 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
13f90 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
13fa0 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
13fb0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
13fc0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
13fd0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
13fe0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
13ff0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
14000 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
14010 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
14020 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
14030 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
14040 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
14050 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14060 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
14070 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
14080 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
14090 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
140a0 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
140b0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
140c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
140d0 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
140e0 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
140f0 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
14100 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
14110 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
14120 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
14130 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
14140 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
14150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14160 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
14170 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
14180 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
14190 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
141a0 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
141b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
141c0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
141d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
141e0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
141f0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14200 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
14210 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
14220 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
14230 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
14240 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
14250 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
14260 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
14270 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
14280 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
14290 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e  NS_NONE;.  pBt->
142a0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e  inStmt = 0;.  un
142b0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
142c0 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
142d0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
142e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
142f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14300 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72  c;.}../*.** Star
14310 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  t a statement su
14320 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 54  btransaction.  T
14330 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
14340 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  n can.** can be 
14350 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64 65  rolled back inde
14360 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
14370 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
14380 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20 73  n..** You must s
14390 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
143a0 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  on before starti
143b0 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
143c0 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62 74  ion..** The subt
143d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
143e0 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
143f0 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y if the main tr
14400 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d  ansaction.** com
14410 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
14420 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f  ck..**.** Only o
14430 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ne subtransactio
14440 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65 20  n may be active 
14450 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20 69  at a time.  It i
14460 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 72  s an error to tr
14470 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61 20  y.** to start a 
14480 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74 69  new subtransacti
14490 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73 75  on if another su
144a0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
144b0 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
144c0 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
144d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
144e0 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
144f0 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
14500 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
14510 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
14520 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
14530 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
14540 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
14550 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
14560 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
14570 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
14580 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
14590 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
145a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
145b0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
145c0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
145d0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
145e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
145f0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
14600 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
14610 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
14620 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
14630 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14640 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
14650 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
14660 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
14670 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
14680 73 65 72 74 28 20 21 70 42 74 2d 3e 69 6e 53 74  sert( !pBt->inSt
14690 6d 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mt );.  assert( 
146a0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  pBt->readOnly==0
146b0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
146c0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
146d0 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e  S_WRITE || pBt->
146e0 69 6e 53 74 6d 74 20 7c 7c 20 70 42 74 2d 3e 72  inStmt || pBt->r
146f0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
14700 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
14710 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RNAL;.  }else{. 
14720 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14730 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14740 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
14750 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
14760 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
14770 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
14780 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
14790 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69  with.    ** an i
147a0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
147b0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
147c0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
147d0 74 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  tly using.    **
147e0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
147f0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
14800 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
14810 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
14820 20 20 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65      ** such save
14830 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
14840 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
14850 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
14860 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20   is active..    
14870 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
14880 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
14890 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
148a0 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
148b0 6f 69 6e 74 2b 31 29 3b 0a 20 20 20 20 70 42 74  oint+1);.    pBt
148c0 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20  ->inStmt = 1;.  
148d0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
148e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
148f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14900 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d  Commit the statm
14910 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
14920 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
14930 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f  progress.  If no
14940 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69  .** subtransacti
14950 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68  on is active, th
14960 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
14970 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14980 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72  eeCommitStmt(Btr
14990 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
149a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
149b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
149c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
149d0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
149e0 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
149f0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d   pBt->readOnly==
14a00 30 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  0 );.  if( pBt->
14a10 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e  inStmt ){.    in
14a20 74 20 69 53 74 6d 74 70 6f 69 6e 74 20 3d 20 70  t iStmtpoint = p
14a30 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
14a40 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14a50 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
14a60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 41  (pBt->pPager, SA
14a70 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
14a80 20 69 53 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20   iStmtpoint);.  
14a90 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
14aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14ab0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
14ac0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14ad0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14ae0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14af0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74  Rollback the act
14b00 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  ive statement su
14b10 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49  btransaction.  I
14b20 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74  f no subtransact
14b30 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65  ion.** is active
14b40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14b50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
14b60 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
14b70 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
14b80 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
14b90 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a  n.  Any attempt.
14ba0 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  ** to use a curs
14bb0 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
14bc0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
14bd0 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
14be0 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75  ion.** will resu
14bf0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
14c00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
14c10 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28  reeRollbackStmt(
14c20 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
14c30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14c40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14c50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
14c60 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14c70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
14c80 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
14c90 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  pBt->readOnly==0
14ca0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
14cb0 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 6e 74  nStmt ){.    int
14cc0 20 69 53 74 6d 74 70 6f 69 6e 74 20 3d 20 70 2d   iStmtpoint = p-
14cd0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  >db->nSavepoint;
14ce0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14cf0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
14d00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 41 56  pBt->pPager, SAV
14d10 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
14d20 20 69 53 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20   iStmtpoint);.  
14d30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
14d50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
14d60 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
14d70 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  ger, SAVEPOINT_R
14d80 45 4c 45 41 53 45 2c 20 69 53 74 6d 74 70 6f 69  ELEASE, iStmtpoi
14d90 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
14da0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
14db0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
14dc0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14de0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
14df0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
14e00 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
14e10 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
14e20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
14e30 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14e40 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
14e50 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
14e60 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
14e70 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
14e80 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
14e90 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
14ea0 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
14eb0 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
14ec0 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
14ed0 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
14ee0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
14ef0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
14f00 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
14f10 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
14f20 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
14f30 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
14f40 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
14f50 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
14f60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
14f70 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
14f80 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
14f90 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
14fa0 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
14fb0 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
14fc0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
14fd0 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
14fe0 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
14ff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
15000 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
15010 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
15020 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
15030 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
15040 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
15050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15060 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
15070 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
15080 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
15090 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
150a0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
150b0 42 74 2d 3e 69 6e 53 74 6d 74 3d 3d 30 20 29 3b  Bt->inStmt==0 );
150c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
150d0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
150e0 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
150f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
15100 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
15110 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
15120 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
15130 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
15140 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
15150 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15160 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62  (p);.    pBt->db
15170 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 72 63   = p->db;.    rc
15180 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
15190 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
151a0 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
151b0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
151c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
151d0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
151e0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
151f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
15200 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
15210 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15220 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
15230 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
15240 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
15250 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
15260 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
15270 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
15280 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
15290 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
152a0 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
152b0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
152c0 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
152d0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
152e0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
152f0 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
15300 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
15310 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
15320 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
15330 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
15340 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
15350 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
15360 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
15370 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
15380 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
15390 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
153a0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
153b0 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
153c0 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
153d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
153e0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
153f0 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
15400 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
15410 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
15420 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
15430 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
15440 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
15450 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
15460 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
15470 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
15480 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
15490 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
154a0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
154b0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
154c0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
154d0 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
154e0 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
154f0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
15500 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
15510 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
15520 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
15530 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
15540 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
15550 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
15560 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
15570 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
15580 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
15590 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
155a0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
155b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
155c0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
155d0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
155e0 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
155f0 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
15600 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
15610 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
15620 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
15630 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
15640 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
15650 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
15660 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
15670 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
15680 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
15690 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
156a0 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20   .** pointed to 
156b0 62 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65  by pCur have bee
156c0 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20  n zeroed by the 
156d0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
156e0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
156f0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15720 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
15730 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15750 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
15760 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
15770 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
15780 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
157a0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
157b0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
157c0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
157d0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
157e0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
157f0 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
15800 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
15810 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
15840 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
15850 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
15860 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74  Pgno nPage;.  Bt
15870 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15880 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
15890 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
158a0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
158b0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
158c0 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
158d0 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ;.  if( wrFlag )
158e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
158f0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
15900 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 42      if( NEVER(pB
15910 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  t->readOnly) ){.
15920 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15930 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
15940 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63    }.    if( chec
15950 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
15960 61 62 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20  able, 0, 0) ){. 
15970 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15980 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  TE_LOCKED;.    }
15990 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d  .  }..  if( pBt-
159a0 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20  >pPage1==0 ){.  
159b0 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
159c0 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20  WithRetry(p);.  
159d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
159e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
159f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15a00 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  }.  pCur->pgnoRo
15a10 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
15a20 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
15a30 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
15a40 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e  pBt->pPager, (in
15a50 74 20 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20 20  t *)&nPage); .  
15a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15a70 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
15a80 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  rc;.  }.  if( iT
15a90 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67 65  able==1 && nPage
15aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
15ab0 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
15ac0 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
15ad0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
15ae0 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
15af0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
15b00 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
15b10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29  pCur->apPage[0])
15b20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
15b40 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
15b50 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  exception;.  }..
15b60 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
15b70 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
15b80 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
15b90 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
15ba0 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
15bb0 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65  iables, link the
15bc0 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
15bd0 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 20 61   BtShared list a
15be0 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20 28 74  nd set *ppCur (t
15bf0 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61  he.  ** output a
15c00 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
15c10 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a  function)..  */.
15c20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
15c30 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
15c40 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
15c50 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
15c60 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c  Bt;.  pCur->wrFl
15c70 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b  ag = (u8)wrFlag;
15c80 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
15c90 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
15ca0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
15cb0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
15cc0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
15cd0 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
15ce0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
15cf0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
15d00 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a  URSOR_INVALID;..
15d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15d20 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73  OK;..create_curs
15d30 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20  or_exception:.  
15d40 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
15d50 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20  ->apPage[0]);.  
15d60 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15d70 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
15d80 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15d90 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
15da0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15dd0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
15de0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e10 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
15e20 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
15e30 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
15e60 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
15e70 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
15e80 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
15e90 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
15ea0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
15eb0 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
15ec0 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
15ed0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
15f00 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
15f10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
15f20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15f30 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
15f40 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
15f50 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
15f60 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
15f70 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
15f80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15f90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15fa0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
15fb0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
15fc0 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20  ize(){.  return 
15fd0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
15fe0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ;.}..../*.** Clo
15ff0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
16000 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
16010 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16020 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
16030 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
16040 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
16050 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16060 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
16070 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
16080 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
16090 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
160a0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
160b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
160c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
160d0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
160e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
160f0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74  pBtree);.    pBt
16100 2d 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64  ->db = pBtree->d
16110 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  b;.    sqlite3Bt
16120 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
16130 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Cur);.    if( pC
16140 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
16150 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
16160 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
16170 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
16180 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
16190 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
161a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
161b0 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
161c0 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74       pCur->pNext
161d0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
161e0 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
161f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
16200 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
16210 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16220 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
16230 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  ]);.    }.    un
16240 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
16250 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61  d(pBt);.    inva
16260 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
16270 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f  che(pCur);.    /
16280 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  * sqlite3_free(p
16290 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  Cur); */.    sql
162a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
162b0 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
162c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
162d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
162e0 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
162f0 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74   by filling in t
16300 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65  he fields of pTe
16310 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65  mpCur..** The te
16320 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69  mporary cursor i
16330 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72  s not on the cur
16340 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65  sor list for the
16350 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20   Btree..*/.void 
16360 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
16370 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
16380 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73  or *pCur, BtCurs
16390 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20  or *pTempCur){. 
163a0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
163b0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
163c0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65  ex(pCur) );.  me
163d0 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70  mcpy(pTempCur, p
163e0 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75  Cur, sizeof(BtCu
163f0 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  rsor));.  pTempC
16400 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
16410 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
16420 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
16430 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50   i<=pTempCur->iP
16440 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  age; i++){.    s
16450 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
16460 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  TempCur->apPage[
16470 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  i]->pDbPage);.  
16480 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 6d  }.  assert( pTem
16490 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b  pCur->pKey==0 );
164a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
164b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
164c0 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
164d0 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
164e0 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
164f0 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
16500 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  above..*/.void s
16510 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
16520 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  seTempCursor(BtC
16530 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
16540 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
16550 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
16560 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f 72  x(pCur) );.  for
16570 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
16580 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
16590 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
165a0 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  f(pCur->apPage[i
165b0 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ]->pDbPage);.  }
165c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
165d0 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a  pCur->pKey);.}..
165e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
165f0 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
16600 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
16610 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
16620 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
16630 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
16640 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
16650 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
16660 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
16670 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
16680 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
16690 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
166a0 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
166b0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
166c0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
166d0 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
166e0 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
166f0 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
16700 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  o sqlite3BtreePa
16710 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
16720 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
16730 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
16740 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
16750 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
16760 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
16770 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
16780 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
16790 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
167a0 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
167b0 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
167c0 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
167d0 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
167e0 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
167f0 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
16800 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
16810 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
16820 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
16830 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
16840 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
16850 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
16860 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
16870 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
16880 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
16890 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
168a0 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
168b0 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
168c0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
168d0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
168e0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
168f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
16900 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
16910 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
16920 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
16930 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
16940 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
16950 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
16960 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
16970 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
16980 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
16990 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
169a0 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
169b0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
169c0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
169d0 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
169e0 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
169f0 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
16a00 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
16a10 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
16a20 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
16a30 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
16a40 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
16a50 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
16a60 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
16a70 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
16a80 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
16a90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
16aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
16ab0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
16ac0 61 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  age;.      sqlit
16ad0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
16ae0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
16af0 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
16b00 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
16b10 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
16b20 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
16b30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16b40 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
16b50 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
16b60 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
16b70 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
16b80 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
16b90 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
16ba0 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
16bb0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
16bc0 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
16bd0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
16be0 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
16c20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
16c30 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69           \.    i
16c70 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
16c80 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  >iPage;         
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cb0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
16cc0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
16cd0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
16ce0 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
16cf0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
16d00 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20  ur->info); \.   
16d10 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
16d20 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
16d60 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
16db0 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
16dc0 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20  o(pCur);        
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16e00 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d    }.#endif /* _M
16e10 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SC_VER */../*.**
16e20 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
16e30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
16e40 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
16e50 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
16e60 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
16e70 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
16e80 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
16e90 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
16ea0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
16eb0 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
16ec0 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
16ed0 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
16ee0 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
16ef0 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
16f00 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
16f10 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
16f20 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
16f30 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
16f40 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
16f50 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
16f60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
16f70 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
16f80 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16f90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
16fa0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
16fb0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
16fc0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
16fd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
16ff0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
17000 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
17010 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
17020 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
17030 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
17040 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
17050 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a  VALID ){.      *
17060 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
17070 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
17080 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
17090 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
170a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
170b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
170c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
170d0 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
170e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
170f0 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
17100 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
17110 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
17120 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73  ints to.  Always
17130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17140 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  K..** Failure is
17150 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
17160 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
17170 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a   not currently.*
17180 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  * pointing to an
17190 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61   entry (which ca
171a0 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
171b0 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
171c0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
171d0 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20  ty) then *pSize 
171e0 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
171f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17200 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
17210 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
17220 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
17230 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
17240 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
17250 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
17260 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
17270 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
17280 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17290 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
172a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
172b0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
172c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
172d0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
172e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
172f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
17300 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  {.      /* Not p
17310 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
17320 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
17330 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
17340 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
17350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17360 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
17370 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
17380 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
17390 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
173a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
173b0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
173c0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
173d0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
173e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
173f0 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
17400 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
17410 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
17420 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
17430 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
17440 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
17450 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
17460 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
17470 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
17480 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
17490 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
174a0 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
174b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
174c0 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
174d0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
174e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
174f0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
17500 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
17510 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
17520 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78 74  Unless pPgnoNext
17530 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61   is NULL, the pa
17540 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
17550 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a   next overflow .
17560 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ** page in the l
17570 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77 72  inked list is wr
17580 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
17590 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
175a0 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  l.** is the last
175b0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
175c0 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  ked list, *pPgno
175d0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
175e0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
175f0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
17600 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  L, *ppPage is se
17610 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  t to the MemPage
17620 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20  * handle.** for 
17630 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20 75  page ovfl. The u
17640 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72 20  nderlying pager 
17650 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62 65  page may have be
17660 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  en requested.** 
17670 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65  with the noConte
17680 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f 20  nt flag set, so 
17690 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61 63  the page data ac
176a0 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20  cessable via.** 
176b0 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79 20  this handle may 
176c0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
176d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
176e0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
176f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
17700 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
17730 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
17740 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
17750 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
17760 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50  ge handle */.  P
17770 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
17780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17790 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
177a0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
177b0 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
177c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
177d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
177e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
177f0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
17800 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65  tex) );.  /* One
17810 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20 6e   of these must n
17820 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65  ot be NULL. Othe
17830 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c 20  rwise, why call 
17840 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a  this function? *
17850 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61 67  /.  assert(ppPag
17860 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b  e || pPgnoNext);
17870 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e  ..  /* If pPgnoN
17880 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ext is NULL, the
17890 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
178a0 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
178b0 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61  to obtain.  ** a
178c0 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72 65   MemPage* refere
178d0 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67  nce only. No pag
178e0 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69 72  e-data is requir
178f0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
17900 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67  .  */.  if( !pPg
17910 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65  noNext ){.    re
17920 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
17930 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
17940 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a  fl, ppPage, 1);.
17950 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
17960 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
17970 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
17980 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
17990 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
179a0 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
179b0 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
179c0 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
179d0 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
179e0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
179f0 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
17a00 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
17a10 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
17a20 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
17a30 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
17a40 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
17a50 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
17a60 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
17a70 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
17a80 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
17a90 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
17aa0 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
17ab0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
17ac0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
17ad0 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
17ae0 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
17af0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
17b00 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
17b10 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
17b20 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
17b30 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
17b40 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
17b50 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
17b60 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
17b70 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
17b80 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
17b90 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
17ba0 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
17bb0 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
17bc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
17be0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
17bf0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
17c00 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
17c10 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
17c20 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
17c30 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 7d   iGuess;.      }
17c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
17c50 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  f..  if( next==0
17c60 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20 20   || ppPage ){.  
17c70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
17c80 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20   = 0;..    rc = 
17c90 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
17ca0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
17cb0 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b  pPage, next!=0);
17cc0 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d  .    assert(rc==
17cd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
17ce0 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20  ge==0);.    if( 
17cf0 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53  next==0 && rc==S
17d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17d10 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
17d20 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
17d30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
17d40 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  ppPage ){.      
17d50 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
17d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17d70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
17d80 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
17d90 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
17da0 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  ext;..  return r
17db0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  c;.}../*.** Copy
17dc0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
17dd0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
17de0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
17df0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
17e00 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
17e10 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
17e20 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
17e30 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
17e40 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
17e50 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
17e60 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
17e70 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
17e80 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
17e90 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
17ea0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
17eb0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
17ec0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
17ed0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
17ee0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
17ef0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
17f00 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
17f10 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
17f20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
17f30 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
17f40 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
17f50 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
17f60 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
17f70 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
17f80 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
17f90 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
17fa0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
17fb0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
17fc0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
17fd0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17ff0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
18000 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
18030 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
18040 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
18050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
18060 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
18070 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
18080 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
18090 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
180a0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
180b0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
180c0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
180d0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
180e0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
180f0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
18100 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
18110 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
18120 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
18130 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18150 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18160 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
18170 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
18180 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
18190 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
181a0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
181b0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
181c0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
181d0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
181e0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
181f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
18200 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18210 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18220 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
18230 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
18240 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
18250 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
18260 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
18270 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
18280 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
18290 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
182a0 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
182b0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
182c0 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
182d0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
182e0 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
182f0 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
18300 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
18310 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
18320 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
18330 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
18340 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
18350 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
18360 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
18370 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
18380 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
18390 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f..**.** This ro
183a0 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d  utine does not m
183b0 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f  ake a distinctio
183c0 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e  n between key an
183d0 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75  d data..** It ju
183e0 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69 74  st reads or writ
183f0 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68  es bytes from th
18400 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20  e payload area. 
18410 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20   Data might .** 
18420 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
18430 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63  in page or be sc
18440 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
18450 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
18460 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a   .** pages..**.*
18470 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
18480 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
18490 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
184a0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
184b0 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
184c0 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
184d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
184e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
184f0 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
18500 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
18510 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
18520 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
18530 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
18540 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
18550 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
18560 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
18570 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
18580 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
18590 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
185a0 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
185b0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
185c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
185d0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
185e0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
185f0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
18600 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
18610 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
18620 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
18630 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
18640 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
18650 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
18660 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
18670 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
18680 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
18690 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
186a0 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
186b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
186c0 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
186d0 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
186e0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
186f0 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
18700 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
18710 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
18720 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
18730 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
18740 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
18750 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
18760 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
18770 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
18780 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
18790 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
187a0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
187b0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
187c0 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
187d0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
187e0 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
187f0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
18800 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
18810 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
18820 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
18830 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
18840 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
18850 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
18860 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
18870 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20 20   skipKey,       
18880 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69    /* offset begi
18890 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ns at data if th
188a0 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  is is true */.  
188b0 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
188c0 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
188d0 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
188e0 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
188f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18900 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
18910 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18920 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
18930 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
18940 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
18950 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
18960 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72  ->iPage]; /* Btr
18970 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
18980 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
18990 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
189a0 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
189b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
189c0 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
189d0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
189e0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
189f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18a00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18a10 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
18a20 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
18a30 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
18a40 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
18a50 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
18a60 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
18a70 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
18a80 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
18a90 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
18aa0 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
18ab0 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79  .nHeader;.  nKey
18ac0 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65   = (pPage->intKe
18ad0 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75  y ? 0 : (int)pCu
18ae0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a  r->info.nKey);..
18af0 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
18b00 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e  .    offset += n
18b10 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  Key;.  }.  if( o
18b20 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
18b30 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
18b40 61 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f  a .   || &aPaylo
18b50 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
18b60 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
18b70 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
18b80 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20  eSize].  ){.    
18b90 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
18ba0 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
18bb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
18bc0 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
18bd0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
18be0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18bf0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
18c00 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
18c10 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
18c20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
18c30 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
18c40 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
18c50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18c60 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
18c70 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
18c80 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
18c90 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
18ca0 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
18cb0 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
18cc0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
18cd0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
18ce0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
18cf0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61  Buf, a, eOp, pPa
18d00 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
18d10 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
18d20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
18d30 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
18d40 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
18d50 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
18d60 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  cal;.  }..  if( 
18d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18d80 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
18d90 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
18da0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
18db0 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
18dc0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
18dd0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
18de0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
18df0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
18e00 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
18e10 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
18e20 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  al]);..#ifndef S
18e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
18e40 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  LOB.    /* If th
18e50 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  e isIncrblobHand
18e60 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  le flag is set a
18e70 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  nd the BtCursor.
18e80 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20  aOverflow[].    
18e90 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
18ea0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
18eb0 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20  ate it now. The 
18ec0 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
18ed0 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74  t.    ** one ent
18ee0 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
18ef0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
18f00 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
18f10 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   The.    ** page
18f20 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
18f30 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
18f40 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
18f50 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20  aOverflow[0],.  
18f60 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75    ** etc. A valu
18f70 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
18f80 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
18f90 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
18fa0 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68  nown".    ** (th
18fb0 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
18fc0 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
18fd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
18fe0 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
18ff0 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  dle && !pCur->aO
19000 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
19010 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
19020 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
19030 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
19040 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
19050 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
19060 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
19070 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65  = (Pgno *)sqlite
19080 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
19090 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b  of(Pgno)*nOvfl);
190a0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
190b0 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
190c0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
190d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
190e0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
190f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
19100 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
19110 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
19120 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
19130 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
19140 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
19150 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
19160 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
19170 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
19180 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
19190 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
191a0 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
191b0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
191c0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
191d0 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
191e0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
191f0 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
19200 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
19210 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
19220 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
19230 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
19240 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
19250 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
19260 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
19270 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
19280 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
19290 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
192a0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
192b0 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
192c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
192d0 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
192e0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
192f0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
19300 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
19310 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
19320 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
19330 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
19340 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
19350 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
19360 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
19370 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
19380 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
19390 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
193a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
193b0 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
193c0 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
193d0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
193e0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
193f0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
19400 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
19410 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
19420 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
19430 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
19440 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
19450 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
19460 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
19470 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
19480 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
19490 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
194a0 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
194b0 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
194c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
194d0 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
194e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
194f0 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
19500 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
19510 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
19520 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
19530 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
19540 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
19550 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
19560 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
19570 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
19580 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
19590 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
195a0 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
195b0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
195c0 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
195d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
195e0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
195f0 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
19600 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
19610 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
19620 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
19630 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
19640 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
19650 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
19660 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
19670 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67  */.        DbPag
19680 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
19690 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
196a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
196b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
196c0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
196d0 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  age, &pDbPage);.
196e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
196f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19700 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
19710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
19720 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
19730 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
19740 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
19750 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
19760 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
19770 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
19780 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20              a = 
19790 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
197a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
197b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
197c0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
197d0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
197e0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
197f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
19800 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19810 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
19820 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
19830 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74  0;.          amt
19840 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20   -= a;.         
19850 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
19860 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19870 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
19880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19890 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
198a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
198b0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
198c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
198d0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
198e0 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
198f0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
19900 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
19910 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
19920 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
19930 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
19940 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
19950 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
19960 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
19970 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
19980 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
19990 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
199a0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
199b0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
199c0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
199d0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
199e0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
199f0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
19a00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19a10 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
19a20 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
19a30 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
19a40 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
19a50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
19a60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19a70 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
19a80 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
19a90 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
19aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19ab0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
19ac0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19ad0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
19ae0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
19af0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
19b00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
19b10 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ge] );.    if( p
19b20 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
19b30 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
19b40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19b50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19b60 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
19b70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
19b80 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
19b90 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
19ba0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
19bb0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
19bc0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
19bd0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
19be0 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29  har*)pBuf, 0, 0)
19bf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19c00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
19c10 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
19c20 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
19c30 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
19c40 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
19c50 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
19c60 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
19c70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
19c80 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
19c90 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
19ca0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
19cb0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
19cc0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19cd0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
19ce0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
19cf0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
19d00 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
19d10 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
19d20 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
19d30 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
19d40 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
19d50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
19d60 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
19d70 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
19d80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
19d90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19da0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
19db0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19dc0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
19dd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19de0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
19df0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
19e00 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19e10 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
19e20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
19e30 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19e40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19e50 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19e60 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19e70 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19e80 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19e90 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
19ea0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
19eb0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
19ec0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
19ed0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
19ee0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
19ef0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
19f00 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
19f10 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
19f20 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
19f30 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 1, 0);.  }. 
19f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19f50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
19f60 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
19f70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
19f80 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
19f90 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
19fa0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
19fb0 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
19fc0 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
19fd0 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
19fe0 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
19ff0 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
1a000 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
1a010 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
1a020 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
1a030 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a040 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
1a050 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
1a060 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
1a070 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
1a080 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
1a090 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
1a0a0 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
1a0b0 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
1a0c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
1a0d0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
1a0e0 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
1a0f0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
1a100 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
1a110 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
1a120 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
1a130 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
1a140 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
1a150 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
1a160 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1a170 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
1a180 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
1a190 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
1a1a0 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
1a1b0 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
1a1c0 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
1a1d0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
1a1e0 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
1a1f0 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
1a200 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
1a210 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  bly.** the key/d
1a220 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
1a230 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
1a240 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
1a250 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1a260 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
1a270 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
1a280 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
1a290 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
1a2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1a2b0 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
1a2c0 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
1a2d0 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
1a2e0 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
1a2f0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
1a300 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
1a310 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68  gned char *fetch
1a320 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
1a330 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1a340 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1a350 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
1a360 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
1a370 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20  t *pAmt,        
1a380 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1a390 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1a3a0 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
1a3b0 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20  /.  int skipKey 
1a3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64           /* read
1a3d0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61   beginning at da
1a3e0 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
1a3f0 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
1a400 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
1a410 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad;.  MemPage *p
1a420 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Page;.  u32 nKey
1a430 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a  ;.  u32 nLocal;.
1a440 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
1a450 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
1a460 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
1a470 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1a480 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
1a490 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a4a0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1a4b0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a4c0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a4d0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1a4e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1a4f0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
1a500 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1a510 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1a520 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
1a530 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
1a540 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
1a550 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
1a560 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
1a570 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
1a580 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1a590 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
1a5a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1a5b0 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72  nKey = (int)pCur
1a5c0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
1a5d0 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
1a5e0 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b  {.    aPayload +
1a5f0 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63  = nKey;.    nLoc
1a600 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
1a610 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20  nLocal - nKey;. 
1a620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63   }else{.    nLoc
1a630 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
1a640 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20  nLocal;.    if( 
1a650 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20  nLocal>nKey ){. 
1a660 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b       nLocal = nK
1a670 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
1a680 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a  *pAmt = nLocal;.
1a690 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61    return aPayloa
1a6a0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
1a6b0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1a6c0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
1a6d0 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
1a6e0 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
1a6f0 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
1a700 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
1a710 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
1a720 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
1a730 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
1a740 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1a750 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
1a760 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
1a770 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
1a780 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
1a790 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
1a7a0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
1a7b0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
1a7c0 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
1a7d0 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
1a7e0 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
1a7f0 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
1a800 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
1a810 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
1a820 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
1a830 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
1a840 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
1a850 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
1a860 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1a870 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
1a880 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
1a890 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
1a8a0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
1a8b0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
1a8c0 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
1a8d0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
1a8e0 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
1a8f0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
1a900 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
1a910 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1a920 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28  pAmt){.  assert(
1a930 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1a940 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
1a950 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a960 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1a970 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
1a980 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
1a990 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
1a9a0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1a9b0 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64   0;.}.const void
1a9c0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
1a9d0 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
1a9e0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1a9f0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  t){.  assert( cu
1aa00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1aa10 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
1aa20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1aa30 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1aa40 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
1aa50 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
1aa60 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b  (pCur, pAmt, 1);
1aa70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1aa80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
1aa90 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
1aaa0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
1aab0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
1aac0 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
1aad0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
1aae0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
1aaf0 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
1ab00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1ab10 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
1ab20 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
1ab30 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
1ab40 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d  .  int i = pCur-
1ab50 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  >iPage;.  MemPag
1ab60 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42  e *pNewPage;.  B
1ab70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1ab80 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
1ab90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1aba0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1abb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1abc0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1abd0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1abe0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
1abf0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
1ac00 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
1ac10 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
1ac20 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
1ac30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ac40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ac50 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
1ac60 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
1ac70 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
1ac80 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1ac90 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72  eturn rc;.  pCur
1aca0 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20  ->apPage[i+1] = 
1acb0 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
1acc0 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30  ->aiIdx[i+1] = 0
1acd0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
1ace0 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  +;..  pCur->info
1acf0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1ad00 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1ad10 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  0;.  if( pNewPag
1ad20 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20  e->nCell<1 ){.  
1ad30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ad40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ad50 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1ad60 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1ad70 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61   NDEBUG./*.** Pa
1ad80 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
1ad90 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
1ada0 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
1adb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
1adc0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
1add0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
1ade0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
1adf0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
1ae00 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
1ae10 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
1ae20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
1ae30 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
1ae40 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
1ae50 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
1ae60 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
1ae70 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
1ae80 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
1ae90 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
1aea0 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
1aeb0 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
1aec0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
1aed0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
1aee0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
1aef0 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
1af00 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
1af10 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
1af20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
1af30 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
1af40 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
1af50 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
1af60 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
1af70 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
1af80 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1af90 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
1afa0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
1afb0 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
1afc0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
1afd0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
1afe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
1aff0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
1b000 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
1b010 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
1b020 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
1b030 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
1b040 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
1b050 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
1b060 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
1b070 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
1b080 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
1b090 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
1b0a0 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
1b0b0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
1b0c0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
1b0d0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
1b0e0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
1b0f0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1b100 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74  eMoveToParent(Bt
1b110 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1b120 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b130 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1b150 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b160 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
1b170 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1b180 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1b190 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1b1a0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
1b1b0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1b1c0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
1b1d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
1b1e0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
1b1f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
1b200 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1b210 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1b220 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
1b230 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1b240 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b250 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
1b260 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
1b270 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1b280 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1b290 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ey = 0;.}../*.**
1b2a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1b2b0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
1b2c0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1b2d0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
1b2e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
1b2f0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
1b300 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b310 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
1b320 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1b330 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b340 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
1b350 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1b360 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b370 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
1b380 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
1b390 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1b3a0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1b3b0 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
1b3c0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1b3d0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1b3e0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
1b3f0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1b400 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1b410 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
1b420 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
1b430 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1b440 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
1b450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
1b460 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a  ur->skip;.    }.
1b470 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b480 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1b490 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
1b4a0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
1b4b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
1b4c0 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d  or(i=1; i<=pCur-
1b4d0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1b4e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1b4f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
1b500 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1b510 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20  .    if( .      
1b520 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
1b530 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
1b540 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
1b550 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
1b560 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20  ge[0])).    ){. 
1b570 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1b580 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1b590 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
1b5a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
1b5b0 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
1b5c0 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
1b5d0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
1b5e0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
1b5f0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   );.  pCur->iPag
1b600 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
1b610 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
1b620 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1b630 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
1b640 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
1b650 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1b660 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
1b670 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
1b680 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1b690 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
1b6a0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
1b6b0 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
1b6c0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
1b6d0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
1b6e0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
1b6f0 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
1b700 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
1b710 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1b720 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
1b730 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1b740 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
1b750 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1b760 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1b770 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
1b780 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
1b790 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
1b7a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b7b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1b7c0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1b7d0 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
1b7e0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
1b7f0 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
1b800 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1b810 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1b820 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
1b830 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
1b840 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1b850 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
1b860 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
1b870 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1b880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1b890 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
1b8a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1b8b0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1b8c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b8d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1b8e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1b8f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b900 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1b910 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1b920 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1b930 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1b940 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
1b950 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1b960 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
1b970 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
1b980 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1b990 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1b9a0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1b9b0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1b9c0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1b9d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1b9e0 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
1b9f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1ba00 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
1ba10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ba20 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1ba30 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1ba40 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1ba50 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
1ba60 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
1ba70 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
1ba80 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1ba90 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
1baa0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
1bab0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
1bac0 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
1bad0 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
1bae0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
1baf0 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
1bb00 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
1bb10 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
1bb20 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
1bb30 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
1bb40 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
1bb50 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1bb60 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
1bb70 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
1bb80 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
1bb90 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
1bba0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
1bbb0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
1bbc0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
1bbd0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1bbe0 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
1bbf0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1bc00 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1bc10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1bc20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1bc30 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
1bc40 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1bc50 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1bc60 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1bc70 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1bc80 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1bc90 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
1bca0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1bcb0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
1bcc0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
1bcd0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
1bce0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1bcf0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1bd00 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1bd10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1bd20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
1bd30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1bd40 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1bd50 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1bd60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1bd70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1bd80 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
1bd90 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
1bda0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1bdb0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1bdc0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
1bdd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bde0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1bdf0 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
1be00 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1be10 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
1be20 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
1be30 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
1be40 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
1be50 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
1be60 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
1be70 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
1be80 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
1be90 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1bea0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1beb0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
1bec0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1bed0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1bee0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bef0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bf00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1bf10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1bf20 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1bf30 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1bf40 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1bf50 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bf60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1bf70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1bf80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1bf90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bfa0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1bfb0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1bfc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
1bfd0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
1bfe0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1bff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1c000 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1c010 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c020 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
1c030 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1c040 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1c050 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1c060 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c070 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1c080 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1c090 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1c0a0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1c0b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1c0c0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
1c0d0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
1c0e0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
1c0f0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
1c100 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
1c110 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
1c120 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1c130 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1c140 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
1c150 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1c160 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1c170 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
1c180 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c190 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1c1a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c1b0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1c1c0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1c1d0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1c1e0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1c1f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c200 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
1c210 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1c220 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
1c230 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1c240 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c250 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1c260 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1c270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c280 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1c290 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1c2a0 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
1c2b0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
1c2c0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1c2d0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67  t(pCur);.      g
1c2e0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1c2f0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
1c300 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
1c310 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  E_OK ?1:0;.    }
1c320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c330 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1c340 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
1c350 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
1c360 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
1c370 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
1c380 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
1c390 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
1c3a0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
1c3b0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
1c3c0 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
1c3d0 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1c3e0 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
1c3f0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
1c400 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
1c410 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
1c420 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
1c430 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
1c440 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
1c450 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
1c460 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
1c470 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
1c480 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
1c490 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
1c4a0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
1c4b0 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
1c4c0 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
1c4d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
1c4e0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
1c4f0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
1c500 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
1c510 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
1c520 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
1c530 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
1c540 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
1c550 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
1c560 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
1c570 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
1c580 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
1c590 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
1c5a0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
1c5b0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
1c5c0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
1c5d0 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
1c5e0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
1c5f0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
1c600 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
1c610 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1c620 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
1c630 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
1c640 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
1c650 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
1c660 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1c670 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1c680 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1c690 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1c6a0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1c6b0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1c6c0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1c6d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1c6e0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1c6f0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1c700 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c710 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1c720 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
1c730 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
1c740 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
1c750 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1c760 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1c770 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1c780 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
1c790 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
1c7a0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
1c7b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c7c0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
1c7d0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1c7e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1c7f0 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
1c800 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
1c810 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
1c820 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
1c830 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
1c840 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
1c850 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
1c860 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
1c870 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
1c880 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1c890 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
1c8a0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1c8b0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
1c8e0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1c8f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1c900 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1c910 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1c920 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1c930 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c940 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1c950 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
1c960 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1c970 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
1c980 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
1c990 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
1c9a0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
1c9b0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1c9c0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
1c9d0 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
1c9e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c9f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
1ca00 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1ca10 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
1ca20 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
1ca30 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
1ca40 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
1ca50 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
1ca60 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1ca70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ca80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ca90 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
1caa0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
1cab0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
1cac0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
1cad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cae0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1caf0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1cb00 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
1cb10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1cb20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1cb30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1cb40 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
1cb50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1cb60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1cb70 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
1cb80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1cb90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1cba0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
1cbb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1cbc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1cbd0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1cbe0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
1cbf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1cc00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1cc10 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
1cc20 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
1cc30 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
1cc40 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
1cc50 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
1cc60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1cc70 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1cc80 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1cc90 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a   int c = -1;  /*
1cca0 20 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20   pRes return if 
1ccb0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d  table is empty m
1ccc0 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20  ust be -1 */.   
1ccd0 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
1cce0 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
1ccf0 2d 31 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50  -1;.    if( (!pP
1cd00 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70  age->intKey && p
1cd10 49 64 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70  IdxKey==0) || up
1cd20 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  r<0 ){.      rc 
1cd30 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1cd40 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1cd50 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1cd60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1cd70 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1cd80 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1cd90 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
1cda0 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  6)upr;.    }else
1cdb0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
1cdc0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1cdd0 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77   = (u16)((upr+lw
1cde0 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
1cdf0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
1ce00 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
1ce10 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
1ce20 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  ey;.      int id
1ce30 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
1ce40 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1ce50 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1ce60 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
1ce70 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1ce80 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
1ce90 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1cea0 20 20 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c          u8 *pCel
1ceb0 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  l;.        pCell
1cec0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1ced0 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
1cee0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
1cef0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1cf00 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
1cf10 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79         u32 dummy
1cf20 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
1cf30 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  l += getVarint32
1cf40 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a  (pCell, dummy);.
1cf50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cf60 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
1cf70 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
1cf80 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
1cf90 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
1cfa0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1cfb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
1cfc0 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
1cfd0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
1cfe0 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
1cff0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
1d010 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b  ellKey>intKey );
1d020 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
1d030 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1d040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d050 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b    int available;
1d060 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65  .        pCellKe
1d070 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63  y = (void *)fetc
1d080 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26  hPayload(pCur, &
1d090 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20  available, 0);. 
1d0a0 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20         nCellKey 
1d0b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1d0c0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  y;.        if( a
1d0d0 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b  vailable>=nCellK
1d0e0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
1d0f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
1d100 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 28 69 6e  ecordCompare((in
1d110 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c  t)nCellKey, pCel
1d120 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
1d130 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d140 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
1d150 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
1d160 63 28 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  c( (int)nCellKey
1d170 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1d180 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
1d190 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1d1a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1d1c0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1d1d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d1e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d1f0 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
1d200 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
1d210 79 2c 20 28 76 6f 69 64 2a 29 70 43 65 6c 6c 4b  y, (void*)pCellK
1d220 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ey);.          c
1d230 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1d240 63 6f 72 64 43 6f 6d 70 61 72 65 28 28 69 6e 74  cordCompare((int
1d250 29 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  )nCellKey, pCell
1d260 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
1d270 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d280 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
1d290 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d2a0 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f  c ) goto moveto_
1d2b0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
1d2c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1d2d0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
1d2e0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1d2f0 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
1d300 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1d310 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
1d320 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1d330 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
1d340 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  ;.          upr 
1d350 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20  = lwr - 1;.     
1d360 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d380 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1d390 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1d3a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1d3b0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1d3c0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
1d3d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1d3e0 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
1d3f0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
1d400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d410 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
1d420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d430 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20  if( lwr>upr ){. 
1d440 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
1d450 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
1d460 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  y;.        break
1d470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d480 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d490 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1d4a0 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20  ((lwr+upr)/2);. 
1d4b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1d4c0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
1d4d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d4e0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
1d4f0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1d500 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1d510 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1d520 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
1d530 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
1d540 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
1d550 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1d560 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1d570 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
1d580 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1d590 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1d5a0 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
1d5b0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
1d5c0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
1d5d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1d5e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1d5f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1d600 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1d610 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   );.      if( pR
1d620 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a  es ) *pRes = c;.
1d630 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d640 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
1d650 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1d660 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1d670 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1d680 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  e] = (u16)lwr;. 
1d690 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1d6a0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1d6b0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1d6c0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1d6d0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
1d6e0 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
1d6f0 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1d700 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74  inish;.  }.movet
1d710 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75  o_finish:.  retu
1d720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d730 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
1d740 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
1d750 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
1d760 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
1d770 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
1d780 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
1d790 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1d7a0 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
1d7b0 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
1d7c0 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
1d7d0 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
1d7e0 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
1d7f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d800 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
1d810 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
1d820 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
1d830 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
1d840 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
1d850 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1d860 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
1d870 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
1d880 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
1d890 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
1d8a0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
1d8b0 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
1d8c0 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
1d8d0 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
1d8e0 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
1d8f0 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
1d900 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1d910 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1d920 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1d930 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
1d940 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1d950 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1d960 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
1d970 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
1d980 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
1d990 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
1d9a0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
1d9b0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1d9c0 20 61 53 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20   aSpace[16]; /* 
1d9d0 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
1d9e0 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
1d9f0 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
1da00 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1da10 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
1da20 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
1da30 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
1da40 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1da50 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
1da60 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
1da70 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , pKey,.        
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
1daa0 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
1dab0 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
1dac0 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
1dad0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1dae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
1daf0 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
1db00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1db10 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
1db20 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
1db30 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
1db40 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  );.  if( pKey ){
1db50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1db60 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
1db70 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20  cord(pIdxKey);. 
1db80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1db90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
1dba0 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
1dbb0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1dbc0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1dbd0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
1dbe0 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
1dbf0 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
1dc00 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
1dc10 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
1dc20 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
1dc30 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1dc40 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
1dc50 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
1dc60 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
1dc70 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
1dc80 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
1dc90 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
1dca0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1dcb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
1dcc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1dcd0 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
1dce0 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
1dcf0 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
1dd00 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
1dd10 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
1dd20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
1dd30 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
1dd40 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
1dd50 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
1dd60 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
1dd70 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
1dd80 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
1dd90 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
1dda0 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
1ddb0 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
1ddc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ddd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  n the database c
1dde0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
1ddf0 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
1de00 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
1de10 65 33 42 74 72 65 65 43 75 72 73 6f 72 44 62 28  e3BtreeCursorDb(
1de20 63 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a  const BtCursor *
1de30 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
1de40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1de50 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1de60 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1de70 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70    return pCur->p
1de80 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  Btree->db;.}../*
1de90 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
1dea0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
1deb0 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
1dec0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1ded0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1dee0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1def0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1df00 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1df10 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
1df20 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1df30 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1df40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1df50 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1df60 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
1df70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1df80 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
1df90 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1dfa0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1dfb0 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
1dfc0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1dfd0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1dfe0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1dff0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1e000 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1e010 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e020 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1e030 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1e040 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
1e050 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1e060 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1e070 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
1e080 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
1e090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1e0a0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30  if( pCur->skip>0
1e0b0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
1e0c0 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  ip = 0;.    *pRe
1e0d0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1e0e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1e0f0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20  .  pCur->skip = 
1e100 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
1e110 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1e120 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
1e130 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
1e140 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1e150 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1e160 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
1e170 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
1e180 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
1e190 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1e1a0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1e1b0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
1e1c0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1e1d0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
1e1e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1e1f0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1e200 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
1e210 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1e220 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1e230 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
1e240 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e250 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1e260 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1e270 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1e280 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
1e2a0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
1e2b0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
1e2c0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1e2d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
1e2e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1e2f0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
1e300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1e320 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1e330 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1e340 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1e350 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1e360 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
1e370 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
1e380 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
1e390 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1e3a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1e3b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1e3c0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
1e3d0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
1e3e0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
1e3f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1e400 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e410 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1e420 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
1e430 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
1e440 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
1e450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e460 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
1e470 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
1e480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e490 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
1e4a0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
1e4b0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
1e4c0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
1e4d0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
1e4e0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
1e4f0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
1e500 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
1e510 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
1e520 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
1e530 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1e540 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
1e550 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1e560 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
1e570 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
1e580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e590 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
1e5a0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1e5b0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1e5c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1e5d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1e5e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e5f0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1e600 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1e610 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1e620 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e630 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1e640 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
1e650 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
1e660 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1e670 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1e680 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1e690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e6a0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1e6b0 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20  ur->skip<0 ){.  
1e6c0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1e6d0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1e6e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e6f0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1e700 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
1e710 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1e720 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e730 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
1e740 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1e750 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1e760 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
1e770 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
1e780 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
1e790 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1e7a0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
1e7b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1e7c0 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
1e7d0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1e7e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1e7f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1e800 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
1e810 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1e820 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e830 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
1e840 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
1e850 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
1e860 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1e870 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1e880 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
1e890 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
1e8a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1e8c0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1e8d0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1e8e0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
1e8f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1e900 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1e910 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
1e920 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1e930 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
1e940 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1e950 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1e960 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1e970 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
1e980 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1e990 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1e9a0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
1e9b0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1e9c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e9d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1e9e0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1e9f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ea00 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1ea10 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
1ea20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1ea30 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
1ea40 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
1ea50 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
1ea60 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
1ea70 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
1ea80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1ea90 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
1eaa0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
1eab0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
1eac0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
1ead0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
1eae0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
1eaf0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1eb00 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
1eb10 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
1eb20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
1eb30 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
1eb40 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1eb50 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1eb60 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
1eb70 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1eb80 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
1eb90 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
1eba0 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
1ebb0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
1ebc0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
1ebd0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
1ebe0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
1ebf0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
1ec00 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1ec10 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1ec20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
1ec30 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1ec40 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
1ec50 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
1ec60 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
1ec70 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
1ec80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1ec90 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
1eca0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
1ecb0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
1ecc0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
1ecd0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
1ece0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
1ecf0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
1ed00 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
1ed10 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
1ed20 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
1ed30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
1ed40 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
1ed50 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
1ed60 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
1ed70 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
1ed80 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
1ed90 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
1eda0 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
1edb0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
1edc0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
1edd0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1ede0 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
1edf0 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
1ee00 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
1ee10 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1ee20 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
1ee30 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
1ee40 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1ee50 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
1ee60 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
1ee70 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
1ee80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1ee90 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  1;.  int rc;.  i
1eea0 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt n;     /* Num
1eeb0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1eec0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1eed0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int k;     /* 
1eee0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1eef0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
1ef00 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1ef10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
1ef20 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
1ef30 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
1ef40 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
1ef50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ef60 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1ef70 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
1ef80 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65  pPage1;.  n = ge
1ef90 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1efa0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66  aData[36]);.  if
1efb0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
1efc0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
1efd0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
1efe0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
1eff0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
1f000 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
1f010 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
1f020 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
1f030 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
1f040 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
1f050 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
1f060 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
1f070 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
1f080 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
1f090 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
1f0a0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
1f0b0 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
1f0c0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
1f0d0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
1f0e0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
1f0f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
1f100 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
1f110 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
1f120 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
1f130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f140 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f150 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
1f160 65 61 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65  earby<=pagerPage
1f170 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
1f180 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1f190 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
1f1a0 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
1f1b0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
1f1c0 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
1f1d0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1f1e0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
1f1f0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1f200 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f210 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1f220 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1f230 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
1f240 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
1f250 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
1f260 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
1f270 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1f280 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
1f290 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
1f2a0 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
1f2b0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
1f2c0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
1f2d0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
1f2e0 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
1f2f0 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
1f300 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1f310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f320 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1f330 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f340 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f350 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1f360 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
1f370 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
1f380 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
1f390 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
1f3a0 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
1f3b0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
1f3c0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
1f3d0 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
1f3e0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
1f3f0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
1f400 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
1f410 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
1f420 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
1f430 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
1f440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
1f450 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
1f460 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
1f470 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
1f480 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
1f490 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1f4a0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1f4b0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
1f4c0 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
1f4d0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
1f4e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
1f4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f500 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f510 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
1f520 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
1f530 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1f540 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
1f550 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
1f560 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f570 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
1f580 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
1f590 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1f5a0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
1f5b0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
1f5c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
1f5d0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
1f5e0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
1f5f0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
1f600 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
1f610 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
1f620 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
1f630 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
1f640 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
1f650 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
1f660 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
1f670 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1f680 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
1f690 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1f6a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f6b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1f6c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1f6d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1f6e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1f6f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1f700 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
1f710 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
1f720 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1f730 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1f740 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1f750 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
1f760 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1f770 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1f780 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
1f790 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1f7a0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
1f7b0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
1f7c0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
1f7d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
1f7e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1f7f0 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20  4 - 2 ){.       
1f800 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
1f810 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
1f820 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
1f830 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1f840 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1f850 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1f860 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1f870 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
1f880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f890 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
1f8a0 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
1f8b0 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
1f8c0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1f8d0 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
1f8e0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
1f8f0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
1f900 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
1f910 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
1f920 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
1f930 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
1f940 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
1f950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
1f960 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
1f970 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
1f980 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1f990 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
1f9a0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
1f9b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f9c0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1f9d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f9e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1f9f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1fa00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1fa10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fa20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
1fa30 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1fa40 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1fa50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1fa60 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1fa70 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1fa80 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1fa90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1faa0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1fab0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1fac0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1fad0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1fae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1faf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fb00 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
1fb10 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
1fb20 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
1fb30 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
1fb40 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
1fb50 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
1fb60 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
1fb70 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
1fb80 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
1fb90 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
1fba0 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
1fbb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
1fbc0 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
1fbd0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
1fbe0 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
1fbf0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
1fc00 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
1fc10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fc20 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1fc30 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
1fc40 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
1fc50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1fc60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fc70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1fc80 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1fc90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fca0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fcb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
1fcc0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
1fcd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1fce0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fcf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
1fd00 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1fd10 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
1fd20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1fd30 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1fd40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
1fd50 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
1fd60 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1fd70 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1fd80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
1fd90 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
1fda0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
1fdb0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
1fdc0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1fdd0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
1fde0 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
1fdf0 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
1fe00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
1fe10 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1fe20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
1fe30 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
1fe40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fe50 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1fe60 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1fe70 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
1fe80 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1fe90 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
1fea0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1feb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fec0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fed0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1fee0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
1fef0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1ff00 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1ff10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1ff20 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1ff30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1ff40 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1ff50 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
1ff60 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
1ff70 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1ff80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1ff90 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1ffa0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
1ffb0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
1ffc0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
1ffd0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
1ffe0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
1fff0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
20000 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
20010 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
20020 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
20030 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b      int closest;
20040 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
20050 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
20060 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
20070 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
20080 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
20090 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
200a0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
200b0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
200c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
200d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
200e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
200f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
20100 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
20110 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b      int i, dist;
20120 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
20130 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
20140 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74    dist = get4byt
20150 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
20160 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
20170 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69   if( dist<0 ) di
20180 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20  st = -dist;.    
20190 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
201a0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
201b0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67        int d2 = g
201c0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
201d0 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b  +i*4]) - nearby;
201e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
201f0 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32   d2<0 ) d2 = -d2
20200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
20210 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
20220 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
20230 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
20240 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
20250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
20260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20280 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
20290 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
202a0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
202b0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
202c0 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
202d0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
202e0 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
202f0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
20300 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20   Pgno nPage;.   
20310 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
20320 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
20330 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61   nPage = pagerPa
20340 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
20350 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67          if( *pPg
20360 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  no>nPage ){.    
20370 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
20380 70 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64  page off the end
20390 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
203a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
203b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
203c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
203d0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
203e0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
203f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20400 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
20410 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
20420 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
20430 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
20440 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
20450 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20470 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
20480 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
20490 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
204a0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
204b0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
204c0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
204d0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
204e0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
204f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
20500 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
20510 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
20520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
20530 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
20540 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 72  rIswriteable(pTr
20550 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  unk->pDbPage) );
20560 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20570 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
20580 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
20590 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20   ppPage, 1);.   
205a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
205b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
205c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
205d0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
205e0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
205f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
20600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20610 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
20620 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
20630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20640 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
20660 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
20670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
20680 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
20690 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
206a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
206b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
206c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
206d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
206e0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
206f0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
20700 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
20710 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
20720 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
20730 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
20740 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
20750 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
20760 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
20770 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
20780 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
20790 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e  (pBt);.    *pPgn
207a0 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a  o = nPage + 1;..
207b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
207c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
207d0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
207e0 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
207f0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50  _ISPAGE(pBt, *pP
20800 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  gno) ){.      /*
20810 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
20820 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
20830 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
20840 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
20850 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
20860 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
20870 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
20880 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
20890 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
208a0 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
208b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
208c0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
208d0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
208e0 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
208f0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
20900 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
20910 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
20920 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
20930 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  *pPgno));.      
20940 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
20950 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20960 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
20970 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
20980 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
20990 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
209a0 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29  pBt) ){ (*pPgno)
209b0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
209c0 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
209d0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
209e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
209f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20a00 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
20a10 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
20a20 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
20a30 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20a40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20a50 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
20a60 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
20a70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20a90 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
20aa0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
20ab0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
20ac0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
20ad0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
20ae0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
20af0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
20b00 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20b10 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
20b20 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
20b30 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
20b40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
20b50 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
20b60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20b70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
20b80 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
20b90 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
20ba0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
20bb0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
20bc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
20bd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20be0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
20bf0 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
20c00 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
20c10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20c20 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f  .** Add a page o
20c30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20c40 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ile to the freel
20c50 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ist..**.** sqlit
20c60 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
20c70 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
20c80 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
20c90 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
20ca0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
20cb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20cc0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
20cd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
20ce0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
20cf0 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a   int rc, n, k;..
20d00 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
20d10 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e   page for freein
20d20 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  g */.  assert( s
20d30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20d40 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
20d50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
20d60 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
20d70 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  );.  pPage->isIn
20d80 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  it = 0;..  /* In
20d90 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
20da0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
20db0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
20dc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20dd0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
20de0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
20df0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20  eturn rc;.  n = 
20e00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
20e10 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
20e20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
20e30 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31  ->aData[36], n+1
20e40 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
20e50 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
20e60 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49    /* If the SQLI
20e70 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
20e80 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
20e90 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
20ea0 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79   then.  ** alway
20eb0 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
20ec0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
20ed0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
20ee0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
20ef0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20f00 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
20f10 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
20f20 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
20f30 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
20f40 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
20f50 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
20f60 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
20f70 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
20f80 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
20f90 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
20fa0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
20fb0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
20fc0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
20fd0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
20fe0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
20ff0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
21000 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70  ut(pBt, pPage->p
21010 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  gno, PTRMAP_FREE
21020 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
21030 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
21040 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 3d 3d  ;.  }..  if( n==
21050 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
21060 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72   is the first fr
21070 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  ee page */.    r
21080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21090 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
210a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
210b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
210c0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
210d0 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20  >aData, 0, 8);. 
210e0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
210f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
21100 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
21110 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
21120 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22  AGE: %d first\n"
21130 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
21140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
21150 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65   Other free page
21160 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  s already exist.
21170 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69    Retrive the fi
21180 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  rst trunk page. 
21190 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65     ** of the fre
211a0 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f  elist and find o
211b0 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76  ut how many leav
211c0 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20  es it has. */.  
211d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
211e0 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  k;.    rc = sqli
211f0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
21200 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
21210 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
21220 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  ), &pTrunk, 0);.
21230 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
21240 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20  urn rc;.    k = 
21250 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
21260 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
21270 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61   if( k>=pBt->usa
21280 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
21290 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72  .      /* The tr
212a0 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75  unk is full.  Tu
212b0 72 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  rn the page bein
212c0 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e  g freed into a n
212d0 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  ew.      ** trun
212e0 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c  k page with no l
212f0 65 61 76 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  eaves..      **.
21300 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
21310 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
21320 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
21330 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
21340 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
21350 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
21360 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
21370 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
21380 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
21390 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
213a0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
213b0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
213c0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
213d0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
213e0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
213f0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
21400 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
21410 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
21420 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
21430 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
21440 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
21450 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
21460 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
21470 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
21480 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
21490 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
214a0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
214b0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
214c0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  we will contain 
214d0 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
214e0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
214f0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
21500 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
21510 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
21520 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
21530 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
21540 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
21550 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
21560 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
21570 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
21580 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
21590 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
215a0 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
215b0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
215c0 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
215d0 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
215e0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
215f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
21600 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
21610 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21630 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
21640 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72  Page->aData, pTr
21650 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  unk->pgno);.    
21660 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
21670 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
21680 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
21690 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
216a0 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70  ta[32], pPage->p
216b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52  gno);.        TR
216c0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
216d0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
216e0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
216f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21700 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
21710 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b   pTrunk->pgno));
21720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
21730 73 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20  se if( k<0 ){.  
21740 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21750 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
21760 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64  se{.      /* Add
21770 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64   the newly freed
21780 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20   page as a leaf 
21790 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
217a0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  runk */.      rc
217b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
217c0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
217d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
217e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
217f0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
21800 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
21810 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20  a[4], k+1);.    
21820 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
21830 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a  runk->aData[8+k*
21840 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  4], pPage->pgno)
21850 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21860 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
21870 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21880 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
21890 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
218a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
218b0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
218c0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
218d0 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
218e0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
218f0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
21900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
21910 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
21920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21930 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
21940 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
21950 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
21960 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
21970 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
21980 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
21990 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
219a0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
219b0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
219c0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
219d0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
219e0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
219f0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
21a00 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  nt nOvfl;.  int 
21a10 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
21a20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21a30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
21a40 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
21a50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21a60 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
21a70 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
21a80 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
21a90 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
21aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ab0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
21ac0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
21ad0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
21ae0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
21af0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
21b00 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
21b10 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
21b20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
21b30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
21b40 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
21b50 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
21b60 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
21b70 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
21b80 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
21b90 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
21ba0 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
21bb0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
21bc0 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  -- ){.    MemPag
21bd0 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  e *pOvfl;.    if
21be0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
21bf0 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50   ovflPgno>pagerP
21c00 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
21c10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21c20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21c30 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  T;.    }..    rc
21c40 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
21c50 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
21c60 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c  , &pOvfl, (nOvfl
21c70 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f  ==0)?0:&ovflPgno
21c80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
21c90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
21ca0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76  c = freePage(pOv
21cb0 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fl);.    sqlite3
21cc0 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
21cd0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
21ce0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
21cf0 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
21d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
21d10 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
21d20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
21d30 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
21d40 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
21d50 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
21d60 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
21d70 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
21d80 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
21d90 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
21da0 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
21db0 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
21dc0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
21dd0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
21de0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
21df0 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
21e00 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
21e10 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
21e20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
21e30 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
21e40 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
21e50 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
21e60 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
21e70 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
21e80 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
21e90 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
21ea0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
21eb0 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
21ec0 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
21ed0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
21ee0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
21ef0 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
21f00 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
21f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
21f20 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
21f30 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
21f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21f50 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
21f60 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
21f70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21f80 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
21f90 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
21fa0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
21fb0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
21fc0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
21fd0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
21fe0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
21ff0 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
22000 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
22010 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22030 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
22040 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
22050 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
22060 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
22070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
22080 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
22090 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
220a0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
220b0 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
220c0 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
220d0 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
220e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
220f0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
22100 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
22110 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
22120 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
22130 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
22140 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
22150 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
22160 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
22170 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
22180 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
22190 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
221a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
221b0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
221c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
221d0 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
221e0 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
221f0 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
22200 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
22210 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
22220 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
22230 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
22240 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
22250 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
22260 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
22270 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
22280 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
22290 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
222a0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
222b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
222c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
222d0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
222e0 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
222f0 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
22300 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
22310 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
22320 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
22330 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
22340 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
22350 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
22360 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
22370 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
22380 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
22390 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
223a0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
223b0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
223c0 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
223d0 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Key);.  sqlite3B
223e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
223f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
22400 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
22410 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
22420 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
22430 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
22440 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
22450 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33   info.nData==(u3
22460 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20  2)(nData+nZero) 
22470 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
22480 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
22490 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
224a0 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
224b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
224c0 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
224d0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
224e0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
224f0 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
22500 20 0a 20 20 20 20 2f 2a 20 54 42 44 3a 20 20 50   .    /* TBD:  P
22510 65 72 68 61 70 73 20 72 61 69 73 65 20 53 51 4c  erhaps raise SQL
22520 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 6e  ITE_CORRUPT if n
22530 4b 65 79 20 69 73 20 6c 61 72 67 65 72 20 74 68  Key is larger th
22540 61 6e 20 33 31 20 62 69 74 73 3f 20 2a 2f 0a 20  an 31 bits? */. 
22550 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28     nPayload += (
22560 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
22570 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
22580 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
22590 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  .  }.  *pnSize =
225a0 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73   info.nSize;.  s
225b0 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e  paceLeft = info.
225c0 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f  nLocal;.  pPaylo
225d0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
225e0 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d  der];.  pPrior =
225f0 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
22600 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c  erflow];..  whil
22610 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
22620 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
22630 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
22640 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22650 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
22660 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
22670 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
22680 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
22690 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
226a0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
226b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
226c0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
226d0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
226e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
226f0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
22700 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
22710 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
22720 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
22730 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
22740 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
22750 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
22760 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
22770 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
22780 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
22790 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
227a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
227b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
227c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
227d0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
227e0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
227f0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
22800 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
22810 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
22820 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
22830 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
22840 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
22850 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
22860 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
22870 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
22880 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
22890 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
228a0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
228b0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
228c0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
228d0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
228e0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
228f0 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
22900 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
22910 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
22920 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
22930 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
22940 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
22950 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
22960 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
22970 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
22980 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
22990 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
229a0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
229b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
229c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
229d0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
229e0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
229f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
22a00 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
22a10 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
22a20 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
22a30 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
22a40 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
22a50 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
22a60 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
22a70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
22a80 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
22a90 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
22aa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
22ab0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
22ac0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22ad0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22ae0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
22af0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22b00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
22b10 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
22b20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
22b30 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
22b40 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
22b50 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
22b60 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
22b70 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
22b80 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
22b90 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
22ba0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
22bb0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
22bc0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
22bd0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
22be0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
22bf0 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
22c00 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
22c10 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
22c20 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
22c30 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
22c40 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
22c50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22c60 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
22c70 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
22c80 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
22c90 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
22ca0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
22cb0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
22cc0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
22cd0 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
22ce0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
22cf0 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
22d00 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
22d10 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
22d20 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
22d30 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
22d40 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
22d50 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
22d60 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
22d70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
22d80 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
22d90 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
22da0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
22db0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
22dc0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
22dd0 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
22de0 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
22df0 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
22e00 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
22e10 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
22e20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
22e30 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
22e40 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
22e50 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
22e60 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
22e70 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
22e80 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
22e90 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
22ea0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
22eb0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
22ec0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
22ed0 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
22ee0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
22ef0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
22f00 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
22f10 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
22f20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
22f30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
22f40 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
22f50 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
22f60 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
22f70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
22f80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
22f90 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
22fa0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
22fb0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
22fc0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
22fd0 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
22fe0 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
22ff0 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
23000 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
23010 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
23020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23030 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
23040 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
23050 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
23060 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
23070 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
23080 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
23090 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
230a0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
230b0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
230c0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
230d0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
230e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
230f0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
23100 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
23110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23120 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
23130 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
23140 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
23150 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
23160 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
23170 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
23180 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
23190 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
231a0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
231b0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
231c0 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
231d0 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
231e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
231f0 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
23200 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
23210 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
23220 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
23230 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
23240 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
23250 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
23260 63 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d  c int dropCell(M
23270 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
23280 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
23290 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
232a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
232b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
232c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
232d0 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
232e0 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
232f0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
23300 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
23310 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
23320 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
23330 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
23340 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
23350 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
23360 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
23370 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
23380 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
23390 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
233a0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
233b0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
233c0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
233d0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
233e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
233f0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
23400 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
23410 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
23420 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
23430 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
23440 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
23450 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
23460 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
23470 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
23480 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
23490 70 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c  ptr);.  if( (pc<
234a0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
234b0 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f  +6+(pPage->leaf?
234c0 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70  0:4)).     || (p
234d0 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d  c+sz>pPage->pBt-
234e0 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a  >usableSize) ){.
234f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23500 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23510 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
23520 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
23530 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sz);.  if( rc!=S
23540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23550 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23560 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c   for(i=idx+1; i<
23570 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
23580 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20  +, ptr+=2){.    
23590 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b  ptr[0] = ptr[2];
235a0 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74  .    ptr[1] = pt
235b0 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  r[3];.  }.  pPag
235c0 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75  e->nCell--;.  pu
235d0 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
235e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
235f0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
23600 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
23610 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53  += 2;.  return S
23620 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
23630 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
23640 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
23650 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
23660 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
23670 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
23680 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
23690 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
236a0 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
236b0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
236c0 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
236d0 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
236e0 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
236f0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
23700 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
23710 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
23720 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
23730 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
23740 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
23750 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
23760 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
23770 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
23780 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
23790 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
237a0 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
237b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
237c0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
237d0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
237e0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
237f0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
23800 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
23810 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
23820 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
23830 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
23840 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
23850 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
23860 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
23870 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
23880 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
23890 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
238a0 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
238b0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
238c0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
238d0 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
238e0 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
238f0 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
23900 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
23910 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
23920 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
23930 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
23940 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23950 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
23960 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
23970 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
23980 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
23990 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
239a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
239b0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
239c0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
239d0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
239e0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
239f0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
23a00 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
23a10 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
23a20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
23a30 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
23a40 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
23a50 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
23a60 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
23a70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
23a80 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
23a90 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
23aa0 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
23ab0 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
23ac0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
23ad0 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
23ae0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
23af0 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
23b00 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
23b10 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
23b20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
23b30 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
23b40 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
23b50 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
23b60 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
23b70 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
23b80 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
23b90 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
23ba0 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
23bb0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
23bc0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
23bd0 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
23be0 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
23bf0 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
23c00 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
23c10 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
23c20 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
23c30 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
23c40 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
23c50 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
23c60 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
23c70 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
23c80 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
23c90 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
23ca0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
23cb0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
23cc0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
23cd0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
23ce0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
23cf0 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
23d00 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
23d10 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
23d20 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
23d30 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
23d40 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
23d50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23d60 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
23d70 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
23d80 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
23d90 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
23da0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
23db0 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
23dc0 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20  e(pPage->aOvfl) 
23dd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
23de0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
23df0 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  ge, pCell) );.  
23e00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
23e10 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
23e20 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
23e30 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
23e40 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
23e50 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
23e60 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
23e70 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
23e80 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
23e90 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
23ea0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
23eb0 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
23ec0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
23ed0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
23ee0 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
23ef0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
23f00 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
23f10 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  >aOvfl[0])) );. 
23f20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
23f30 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  j].pCell = pCell
23f40 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
23f50 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36  fl[j].idx = (u16
23f60 29 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  )i;.    pPage->n
23f70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
23f80 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
23f90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23fa0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
23fb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
23fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23fe0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
23ff0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
24000 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
24010 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
24020 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
24030 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  a;.    hdr = pPa
24040 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
24050 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
24060 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
24070 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
24080 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
24090 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
240a0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
240b0 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a  age->nCell + 2;.
240c0 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
240d0 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
240e0 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20  if( end > top - 
240f0 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  sz ){.      rc =
24100 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
24110 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
24120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24130 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
24140 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
24150 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
24160 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
24170 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24180 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
24190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
241a0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
241b0 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
241c0 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
241d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
241e0 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
241f0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
24200 20 20 20 69 66 20 28 69 64 78 2b 73 7a 20 3e 20     if (idx+sz > 
24210 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
24220 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20 20 20 20  leSize) {.      
24230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
24240 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
24250 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  }.    pPage->nCe
24260 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
24270 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20  >nFree -= 2;.   
24280 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
24290 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
242a0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
242b0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d  ;.    for(j=end-
242c0 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b  2, ptr=&data[j];
242d0 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74   j>ins; j-=2, pt
242e0 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72  r-=2){.      ptr
242f0 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20  [0] = ptr[-2];. 
24300 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74       ptr[1] = pt
24310 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  r[-1];.    }.   
24320 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
24330 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
24340 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
24350 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
24360 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
24370 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
24380 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
24390 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
243a0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
243b0 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
243c0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
243d0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
243e0 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
243f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
24400 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
24410 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
24420 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
24430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
24440 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
24450 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24460 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
24470 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
24480 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24490 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
244a0 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
244b0 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
244c0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
244d0 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
244e0 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
244f0 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
24500 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
24510 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
24520 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
24530 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
24540 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
24550 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
24560 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f  Page->pBt, pgnoO
24570 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
24580 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
24590 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
245a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
245b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
245c0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
245d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
245e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
245f0 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
24600 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
24610 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
24620 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
24630 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
24640 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
24650 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
24660 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
24670 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
24680 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
24690 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
246a0 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
246b0 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
246c0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
246d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
246e0 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
246f0 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
24700 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
24710 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
24720 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
24730 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
24740 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
24750 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
24760 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
24770 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
24780 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69  */.  int totalSi
24790 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  ze;    /* Total 
247a0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
247b0 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  s */.  int hdr; 
247c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
247d0 78 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  x of page header
247e0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74   */.  int cellpt
247f0 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  r;      /* Addre
24800 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
24810 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
24820 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f   cellbody;     /
24830 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
24840 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20  t cell body */. 
24850 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
24860 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
24870 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  he page */..  as
24880 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
24890 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
248a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
248b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
248c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
248d0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
248e0 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f  =0 && nCell<=MX_
248f0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
24900 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
24910 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
24920 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30  .  totalSize = 0
24930 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
24940 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
24950 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69  totalSize += aSi
24960 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  ze[i];.  }.  ass
24970 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32  ert( totalSize+2
24980 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e  *nCell<=pPage->n
24990 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Free );.  assert
249a0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
249b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
249c0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
249d0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
249e0 62 50 61 67 65 29 20 29 3b 0a 20 20 63 65 6c 6c  bPage) );.  cell
249f0 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  ptr = pPage->cel
24a00 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  lOffset;.  data 
24a10 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
24a20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
24a30 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32  drOffset;.  put2
24a40 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
24a50 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28  ], nCell);.  if(
24a60 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65   nCell ){.    ce
24a70 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74  llbody = allocat
24a80 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f  eSpace(pPage, to
24a90 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73  talSize);.    as
24aa0 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30  sert( cellbody>0
24ab0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24ac0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20  pPage->nFree >= 
24ad0 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  2*nCell );.    p
24ae0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
24af0 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28  *nCell;.    for(
24b00 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
24b10 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79  +){.      put2by
24b20 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72  te(&data[cellptr
24b30 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
24b40 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
24b50 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
24b60 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
24b70 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20  ;.      cellptr 
24b80 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c  += 2;.      cell
24b90 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  body += aSize[i]
24ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
24bb0 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50  rt( cellbody==pP
24bc0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
24bd0 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50  Size );.  }.  pP
24be0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
24bf0 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
24c00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24c10 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
24c20 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
24c30 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
24c40 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
24c50 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
24c60 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
24c70 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
24c80 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
24c90 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
24ca0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
24cb0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
24cc0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
24cd0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
24ce0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
24cf0 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
24d00 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
24d10 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
24d20 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
24d30 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
24d40 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
24d50 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
24d60 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
24d70 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
24d80 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
24d90 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
24da0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
24db0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
24dc0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
24dd0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
24de0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
24df0 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
24e00 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
24e10 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
24e20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
24e30 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
24e40 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
24e50 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
24e60 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
24e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24e80 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
24e90 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
24ea0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
24eb0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
24ec0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
24ed0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
24ee0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
24ef0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
24f00 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
24f10 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
24f20 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66  sor*, int);..#if
24f30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24f40 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
24f50 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
24f60 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
24f70 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
24f80 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
24f90 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
24fa0 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
24fb0 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
24fc0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
24fd0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
24fe0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
24ff0 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
25000 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
25010 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
25020 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
25030 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
25040 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
25050 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
25060 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
25070 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
25080 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
25090 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
250a0 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
250b0 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
250c0 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
250d0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
250e0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
250f0 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
25100 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
25110 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
25120 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
25130 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
25140 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
25150 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
25160 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
25170 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
25180 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
25190 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
251a0 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
251b0 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
251c0 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
251d0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
251e0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
251f0 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
25200 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
25210 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
25220 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
25230 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
25240 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
25250 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25260 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 42   balance_quick(B
25270 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25280 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
25290 61 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  age *pNew = 0;. 
252a0 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20   Pgno pgnoNew;. 
252b0 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31   u8 *pCell;.  u1
252c0 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c  6 szCell;.  Cell
252d0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 4d 65 6d  Info info;.  Mem
252e0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
252f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25300 3e 69 50 61 67 65 5d 3b 0a 20 20 4d 65 6d 50 61  >iPage];.  MemPa
25310 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 43  ge *pParent = pC
25320 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25330 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 42 74 53  >iPage-1];.  BtS
25340 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
25350 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70  ge->pBt;.  int p
25360 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65  arentIdx = pPare
25370 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20  nt->nCell;   /* 
25380 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69  pParent new divi
25390 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  der cell index *
253a0 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69  /.  int parentSi
253b0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
253c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
253d0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
253e0 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74  l */.  u8 parent
253f0 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20  Cell[64];       
25400 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
25410 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69  e for the new di
25420 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20  vider cell */.. 
25430 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25440 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
25450 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
25460 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
25470 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73   a new page. Ins
25480 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ert the overflow
25490 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
254a0 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54  .  ** into it. T
254b0 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f  hen remove the o
254c0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
254d0 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  m pPage..  */.  
254e0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
254f0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
25500 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
25510 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
25520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
25530 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f  Cell = pPage->aO
25540 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
25550 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53    szCell = cellS
25560 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
25570 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ell);.    assert
25580 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
25590 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e  writeable(pNew->
255a0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
255b0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
255c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  Page->aData[0]);
255d0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
255e0 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
255f0 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  l, &szCell);.   
25600 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
25610 77 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a  w = 0;.  .    /*
25620 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e   pPage is curren
25630 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68  tly the right-ch
25640 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20  ild of pParent. 
25650 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 20 20  Change this.    
25660 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  ** so that the r
25670 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68  ight-child is th
25680 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63  e new page alloc
25690 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20  ated above and. 
256a0 20 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74     ** pPage is t
256b0 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74  he next-to-right
256c0 20 63 68 69 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a   child. .    **.
256d0 20 20 20 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68      ** Ignore th
256e0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
256f0 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 66 69  f the call to fi
25700 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c  llInCell(). fill
25710 49 6e 43 65 6c 6c 28 29 0a 20 20 20 20 2a 2a 20  InCell().    ** 
25720 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20  may only return 
25730 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
25740 45 5f 4f 4b 20 69 66 20 69 74 20 69 73 20 72 65  E_OK if it is re
25750 71 75 69 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61  quired to alloca
25760 74 65 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 6f 72  te.    ** one or
25770 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
25780 61 67 65 73 2e 20 53 69 6e 63 65 20 61 6e 20 69  ages. Since an i
25790 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d  nternal table B-
257a0 54 72 65 65 20 63 65 6c 6c 20 0a 20 20 20 20 2a  Tree cell .    *
257b0 2a 20 6d 61 79 20 6e 65 76 65 72 20 73 70 69 6c  * may never spil
257c0 6c 20 6f 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f  l over onto an o
257d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 28 69 74  verflow page (it
257e0 20 69 73 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66   is a maximum of
257f0 20 0a 20 20 20 20 2a 2a 20 31 33 20 62 79 74 65   .    ** 13 byte
25800 73 20 69 6e 20 73 69 7a 65 29 2c 20 69 74 20 69  s in size), it i
25810 73 20 6e 6f 74 20 6e 65 63 63 65 73 73 61 72 79  s not neccessary
25820 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 72 65   to check the re
25830 74 75 72 6e 20 63 6f 64 65 2e 0a 20 20 20 20 2a  turn code..    *
25840 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72  *.    ** Similar
25850 6c 79 2c 20 74 68 65 20 69 6e 73 65 72 74 43 65  ly, the insertCe
25860 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61  ll() function ca
25870 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20 74 68 65  nnot fail if the
25880 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 62 65 69   page.    ** bei
25890 6e 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ng inserted into
258a0 20 69 73 20 61 6c 72 65 61 64 79 20 77 72 69 74   is already writ
258b0 61 62 6c 65 20 61 6e 64 20 74 68 65 20 63 65 6c  able and the cel
258c0 6c 20 64 6f 65 73 20 6e 6f 74 20 0a 20 20 20 20  l does not .    
258d0 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76  ** contain an ov
258e0 65 72 66 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20  erflow pointer. 
258f0 53 6f 20 69 67 6e 6f 72 65 20 74 68 69 73 20 72  So ignore this r
25900 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a  eturn code too..
25910 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
25920 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
25930 30 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d  0 );.    pCell =
25940 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
25950 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
25960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
25970 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
25980 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
25990 66 6f 29 3b 0a 20 20 20 20 66 69 6c 6c 49 6e 43  fo);.    fillInC
259a0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
259b0 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  entCell, 0, info
259c0 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
259d0 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  &parentSize);.  
259e0 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74    assert( parent
259f0 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 20 20 61  Size<64 );.    a
25a00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
25a10 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
25a20 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
25a30 20 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 43 65   );.    insertCe
25a40 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
25a50 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c  ntIdx, parentCel
25a60 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30  l, parentSize, 0
25a70 2c 20 34 29 3b 0a 20 20 20 20 70 75 74 34 62 79  , 4);.    put4by
25a80 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
25a90 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65  ell(pParent,pare
25aa0 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70  ntIdx), pPage->p
25ab0 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74 34 62 79  gno);.    put4by
25ac0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
25ad0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
25ae0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
25af0 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  w);.  .    /* If
25b00 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
25b10 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
25b20 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
25b30 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20  nter map.    ** 
25b40 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
25b50 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
25b60 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
25b70 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  rom the .    ** 
25b80 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
25b90 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
25ba0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
25bb0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
25bc0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
25bd0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
25be0 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42  gnoNew, PTRMAP_B
25bf0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
25c00 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
25c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25c20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
25c30 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
25c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
25c50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
25c60 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
25c70 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
25c80 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
25c90 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
25ca0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
25cb0 6f 69 6e 74 20 74 68 65 20 70 50 61 67 65 2d 3e  oint the pPage->
25cc0 6e 46 72 65 65 20 76 61 72 69 61 62 6c 65 20 69  nFree variable i
25cd0 73 20 6e 6f 74 20 73 65 74 20 63 6f 72 72 65 63  s not set correc
25ce0 74 6c 79 20 77 69 74 68 0a 20 20 2a 2a 20 72 65  tly with.  ** re
25cf0 73 70 65 63 74 20 74 6f 20 74 68 65 20 63 6f 6e  spect to the con
25d00 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
25d10 20 28 62 65 63 61 75 73 65 20 69 74 20 77 61 73   (because it was
25d20 20 73 65 74 20 74 6f 20 30 20 62 79 20 0a 20 20   set to 0 by .  
25d30 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20  ** insertCell). 
25d40 53 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42  So call sqlite3B
25d50 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74  treeInitPage() t
25d60 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
25d70 73 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a  s.  ** correct..
25d80 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 68    **.  ** This h
25d90 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 20 65 76  as to be done ev
25da0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 77  en if an error w
25db0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
25dc0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 0a 20 20   Normally, if.  
25dd0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
25de0 72 73 20 64 75 72 69 6e 67 20 74 72 65 65 20 62  rs during tree b
25df0 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 20 63 6f  alancing, the co
25e00 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67  ntents of MemPag
25e10 65 20 61 72 65 0a 20 20 2a 2a 20 6e 6f 74 20 69  e are.  ** not i
25e20 6d 70 6f 72 74 61 6e 74 2c 20 61 73 20 74 68 65  mportant, as the
25e30 79 20 77 69 6c 6c 20 62 65 20 72 65 63 61 6c 63  y will be recalc
25e40 75 6c 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  ulated when the 
25e50 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 0a 20  page is rolled. 
25e60 20 2a 2a 20 62 61 63 6b 2e 20 42 75 74 20 68 65   ** back. But he
25e70 72 65 2c 20 69 6e 20 62 61 6c 61 6e 63 65 5f 71  re, in balance_q
25e80 75 69 63 6b 28 29 2c 20 69 74 20 69 73 20 70 6f  uick(), it is po
25e90 73 73 69 62 6c 65 20 74 68 61 74 20 70 50 61 67  ssible that pPag
25ea0 65 20 68 61 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  e has .  ** not 
25eb0 79 65 74 20 62 65 65 6e 20 6d 61 72 6b 65 64 20  yet been marked 
25ec0 64 69 72 74 79 20 6f 72 20 77 72 69 74 74 65 6e  dirty or written
25ed0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
25ee0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  l file. Therefor
25ef0 65 0a 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e  e.  ** it will n
25f00 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
25f10 6b 20 61 6e 64 20 73 6f 20 69 74 20 69 73 20 69  k and so it is i
25f20 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65  mportant to make
25f30 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
25f40 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61 6e  the page data an
25f50 64 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65  d contents of Me
25f60 6d 50 61 67 65 20 61 72 65 20 63 6f 6e 73 69 73  mPage are consis
25f70 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  tent..  */.  pPa
25f80 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
25f90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
25fa0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
25fb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
25fc0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
25fd0 0a 20 20 2f 2a 20 49 66 20 65 76 65 72 79 74 68  .  /* If everyth
25fe0 69 6e 67 20 65 6c 73 65 20 73 75 63 63 65 65 64  ing else succeed
25ff0 65 64 2c 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ed, balance the 
26000 70 61 72 65 6e 74 20 70 61 67 65 2c 20 69 6e 20  parent page, in 
26010 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 64  .  ** case the d
26020 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65  ivider cell inse
26030 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74  rted caused it t
26040 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
26050 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  l..  */.  if( rc
26060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26070 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26080 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
26090 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 72 63  >iPage--;.    rc
260a0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
260b0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
260c0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
260d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
260e0 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f  ICKBALANCE */../
260f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26100 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
26110 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61  Cells on pPage a
26120 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69  nd up to NN*2 si
26130 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61  blings.** of pPa
26140 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  ge so that all p
26150 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
26160 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  the same amount 
26170 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a  of free space..*
26180 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62  * Usually NN sib
26190 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20  lings on either 
261a0 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73  side of pPage is
261b0 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
261c0 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67  ancing,.** thoug
261d0 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  h more siblings 
261e0 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
261f0 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67  one side if pPag
26200 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  e is the first.*
26210 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  * or last child 
26220 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  of its parent.  
26230 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77  If pPage has few
26240 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62  er than 2*NN sib
26250 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68  lings.** (someth
26260 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
26270 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61  ly happen if pPa
26280 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
26290 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69  age or a .** chi
262a0 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e  ld of root) then
262b0 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
262c0 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70  iblings particip
262d0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
262e0 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
262f0 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
26300 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68  gs of pPage migh
26310 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
26320 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
26330 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20  ne or.** two in 
26340 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
26350 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
26360 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
26370 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20   full. The root 
26380 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69  page.** is speci
26390 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65  al and is allowe
263a0 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65  d to be nearly e
263b0 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69  mpty. If pPage i
263c0 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s .** the root p
263d0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  age, then the de
263e0 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
263f0 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
26400 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73  ed.** or decreas
26410 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65  ed by one, as ne
26420 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70  cessary, to keep
26430 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66   the root page f
26440 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65  rom being.** ove
26450 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74  rfull or complet
26460 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  ely empty..**.**
26470 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
26480 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
26490 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
264a0 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  the Cells on pPa
264b0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
264c0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
264d0 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ed in pPage->aDa
264e0 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20  ta[].  This can 
264f0 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
26500 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
26510 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20  l.  Part of the 
26520 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
26530 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b  ine is to.** mak
26540 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73  e sure all Cells
26550 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20   for pPage once 
26560 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61  again fit in pPa
26570 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a  ge->aData[]..**.
26580 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
26590 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
265a0 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  e siblings of pP
265b0 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  age, the parent 
265c0 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  of pPage.** migh
265d0 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  t become overful
265e0 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
265f0 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   If that happens
26600 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
26610 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
26620 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
26630 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  the parent..**.*
26640 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
26650 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
26660 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
26670 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
26680 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
26690 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f  upted state.  So
266a0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
266b0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
266c0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
266d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
266e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
266f0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43  ance_nonroot(BtC
26700 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26710 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26730 54 68 65 20 6f 76 65 72 20 6f 72 20 75 6e 64 65  The over or unde
26740 72 66 75 6c 6c 20 70 61 67 65 20 74 6f 20 62 61  rfull page to ba
26750 6c 61 6e 63 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  lance */.  MemPa
26760 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ge *pParent;    
26770 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
26780 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a  arent of pPage *
26790 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
267a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
267b0 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
267c0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
267d0 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
267e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
267f0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
26800 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
26810 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
26820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
26830 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
26840 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
26850 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
26860 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Old = 0;        
26870 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26880 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
26890 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Old[] */.  int n
268a0 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
268b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
268c0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
268d0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
268e0 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
268f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26900 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
26910 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Div[] */.  int i
26920 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
26930 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
26940 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
26950 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
26960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26970 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20  dex of pPage in 
26980 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
26990 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269b0 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
269c0 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
269d0 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
269e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a00 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
26a10 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f   */.  int leafCo
26a20 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
26a30 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
26a40 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
26a50 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
26a60 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
26a70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26a80 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
26a90 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
26aa0 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
26ab0 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
26ac0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
26ad0 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
26ae0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
26af0 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b10 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
26b20 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
26b30 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
26b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26b50 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
26b60 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
26b70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
26b80 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
26b90 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
26ba0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
26bb0 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
26bc0 6e 74 20 69 53 70 61 63 65 32 20 3d 20 30 3b 20  nt iSpace2 = 0; 
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26be0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
26bf0 20 6f 66 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f   of aSpace2[] */
26c00 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
26c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26c20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
26c30 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
26c40 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
26c50 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
26c60 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
26c70 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
26c80 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  lings */.  Pgno 
26c90 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20  pgnoOld[NB];    
26ca0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
26cb0 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
26cc0 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d   page in apOld[]
26cd0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
26ce0 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
26cf0 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
26d00 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
26d10 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
26d20 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
26d30 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
26d40 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
26d50 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
26d60 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  ancing */.  Pgno
26d70 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20   pgnoNew[NB+2]; 
26d80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
26d90 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
26da0 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b  h page in apNew[
26db0 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  ] */.  u8 *apDiv
26dc0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
26dd0 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
26de0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
26df0 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
26e00 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
26e10 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
26e20 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
26e30 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
26e40 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
26e50 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
26e60 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
26e70 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
26e80 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
26e90 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
26ea0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
26eb0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
26ec0 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
26ed0 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ef0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
26f00 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
26f10 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f  l[] */.  u8 *aCo
26f20 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
26f30 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c  /* Space for hol
26f40 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43  ding data of apC
26f50 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  opy[] */.  u8 *a
26f60 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20  Space1;         
26f70 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
26f80 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
26f90 73 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 62  s cells before b
26fa0 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a  alance */.  u8 *
26fb0 61 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20  aSpace2 = 0;    
26fc0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
26fd0 6f 76 65 72 66 6c 6f 77 20 64 69 76 69 64 65 72  overflow divider
26fe0 73 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 61  s cells after ba
26ff0 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61  lance */.  u8 *a
27000 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20 70 50 61  From = 0;..  pPa
27010 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
27020 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
27030 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27040 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
27050 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
27060 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70  );.  VVA_ONLY( p
27070 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
27080 65 64 20 3d 20 31 20 29 3b 0a 0a 20 20 2f 2a 20  ed = 1 );..  /* 
27090 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70  .  ** Find the p
270a0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f  arent page..  */
270b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
270c0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
270d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
270e0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
270f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
27100 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
27110 70 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67  pDbPage) || pPag
27120 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
27130 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
27140 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74  ->pBt;.  pParent
27150 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27160 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a  pCur->iPage-1];.
27170 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
27180 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  t );.  if( SQLIT
27190 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
271a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
271b0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29  arent->pDbPage))
271c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c   ){.    goto bal
271d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
271e0 7d 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  }..  TRACE(("BAL
271f0 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
27200 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
27210 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
27220 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
27230 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
27240 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
27250 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20  NCE.  /*.  ** A 
27260 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  special case:  I
27270 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61  f a new entry ha
27280 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65  s just been inse
27290 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  rted into a.  **
272a0 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c   table (that is,
272b0 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69 6e   a btree with in
272c0 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61  teger keys and a
272d0 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20 6c  ll data at the l
272e0 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20  eaves).  ** and 
272f0 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
27300 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
27310 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
27320 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20 20  e (it has the.  
27330 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20  ** largest key) 
27340 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70 65  then use the spe
27350 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  cial balance_qui
27360 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
27370 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e  .  ** balancing.
27380 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28    balance_quick(
27390 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72  ) is much faster
273a0 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20   and results in 
273b0 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70  a tighter.  ** p
273c0 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69  acking of data i
273d0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
273e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
273f0 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20  age->leaf &&.   
27400 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
27410 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
27420 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26  >nOverflow==1 &&
27430 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  .      pPage->aO
27440 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
27450 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20  e->nCell &&.    
27460 20 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21    pParent->pgno!
27470 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74 34  =1 &&.      get4
27480 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
27490 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
274a0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61  rOffset+8])==pPa
274b0 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20  ge->pgno.  ){.  
274c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
274d0 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2f  >intKey );.    /
274e0 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43  *.    ** TODO: C
274f0 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67  heck the sibling
27500 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
27510 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62   pPage. It may b
27520 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
27530 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20  ey are not full 
27540 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20  and no new page 
27550 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
27560 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62   */.    return b
27570 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 43 75  alance_quick(pCu
27580 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  r);.  }.#endif..
27590 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
275a0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
275b0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
275c0 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
275d0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
275e0 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
275f0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  .  ** Find the c
27600 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e  ell in the paren
27610 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66  t page whose lef
27620 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62  t child points b
27630 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67  ack.  ** to pPag
27640 65 2e 20 20 54 68 65 20 22 69 64 78 22 20 76 61  e.  The "idx" va
27650 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e  riable is the in
27660 64 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c  dex of that cell
27670 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a  .  If pPage.  **
27680 20 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73   is the rightmos
27690 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
276a0 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64 78 20  nt then set idx 
276b0 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  to pParent->nCel
276c0 6c 20 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20  l .  */.  idx = 
276d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
276e0 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73  ->iPage-1];.  as
276f0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
27700 70 50 61 72 65 6e 74 2c 20 69 64 78 2c 20 70 50  pParent, idx, pP
27710 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f  age->pgno);..  /
27720 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c  *.  ** Find sibl
27730 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61  ing pages to pPa
27740 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73  ge and the cells
27750 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74   in pParent that
27760 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65   divide.  ** the
27770 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61   siblings.  An a
27780 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
27790 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
277a0 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a  gs on either.  *
277b0 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  * side of pPage.
277c0 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20    More siblings 
277d0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
277e0 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
277f0 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20  , if.  ** pPage 
27800 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
27810 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
27820 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
27830 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a  de.  If pParent.
27840 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
27850 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
27860 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
27870 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
27880 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44  aken..  */.  nxD
27890 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20  iv = idx - NN;. 
278a0 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20   if( nxDiv + NB 
278b0 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  > pParent->nCell
278c0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
278d0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d  pParent->nCell -
278e0 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69   NB + 1;.  }.  i
278f0 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20  f( nxDiv<0 ){.  
27900 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
27910 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66  .  nDiv = 0;.  f
27920 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b  or(i=0, k=nxDiv;
27930 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29   i<NB; i++, k++)
27940 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72  {.    if( k<pPar
27950 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
27960 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
27970 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
27980 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b   k);.      nDiv+
27990 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
279a0 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20   !pParent->leaf 
279b0 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  );.      pgnoOld
279c0 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61  [i] = get4byte(a
279d0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  pDiv[i]);.    }e
279e0 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65  lse if( k==pPare
279f0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
27a00 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20     pgnoOld[i] = 
27a10 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
27a20 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
27a30 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
27a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27a50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
27a60 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
27a70 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
27a80 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69  Old[i], &apOld[i
27a90 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
27aa0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
27ab0 65 61 6e 75 70 3b 0a 20 20 20 20 2f 2a 20 61 70  eanup;.    /* ap
27ac0 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e  Old[i]->idxParen
27ad0 74 20 3d 20 6b 3b 20 2a 2f 0a 20 20 20 20 61 70  t = k; */.    ap
27ae0 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Copy[i] = 0;.   
27af0 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64   assert( i==nOld
27b00 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a   );.    nOld++;.
27b10 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
27b20 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
27b30 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
27b40 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  erflow;.  }..  /
27b50 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
27b60 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
27b70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
27b80 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
27b90 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
27ba0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
27bb0 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
27bc0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
27bd0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
27be0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
27bf0 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63  .  */.  szScratc
27c00 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  h =.       nMaxC
27c10 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
27c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c30 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c         /* apCell
27c40 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43   */.     + nMaxC
27c50 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29  ells*sizeof(u16)
27c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c70 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
27c80 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e   */.     + (ROUN
27c90 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
27ca0 65 29 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a  e))+pBt->pageSiz
27cb0 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20  e)*NB  /* aCopy 
27cc0 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
27cd0 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20  ageSize         
27ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cf0 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31        /* aSpace1
27d00 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55   */.     + (ISAU
27d10 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43  TOVACUUM ? nMaxC
27d20 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20  ells : 0);      
27d30 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20         /* aFrom 
27d40 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
27d50 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
27d60 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b  oc( szScratch );
27d70 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d   .  if( apCell==
27d80 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
27d90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
27da0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
27db0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
27dc0 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
27dd0 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
27de0 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a   aCopy[0] = (u8*
27df0 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
27e00 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ls];.  assert( (
27e10 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a  (aCopy[0] - (u8*
27e20 29 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  )0) & 7)==0 ); /
27e30 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
27e40 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
27e50 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
27e60 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
27e70 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
27e80 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
27e90 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
27ea0 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
27eb0 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
27ec0 2d 20 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d  - (u8*)0) & 7)==
27ed0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
27ee0 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
27ef0 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63  d */.  }.  aSpac
27f00 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31  e1 = &aCopy[NB-1
27f10 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
27f20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
27f30 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65  mPage))];.  asse
27f40 72 74 28 20 28 28 61 53 70 61 63 65 31 20 2d 20  rt( ((aSpace1 - 
27f50 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20  (u8*)0) & 7)==0 
27f60 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
27f70 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
27f80 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
27f90 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46 72  ACUUM ){.    aFr
27fa0 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42  om = &aSpace1[pB
27fb0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
27fc0 7d 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73 71  }.  aSpace2 = sq
27fd0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
27fe0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
27ff0 20 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d 30    if( aSpace2==0
28000 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
28010 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
28020 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
28030 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  nup;.  }.  .  /*
28040 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  .  ** Make copie
28050 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  s of the content
28060 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74   of pPage and it
28070 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20  s siblings into 
28080 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65  aOld[]..  ** The
28090 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
280a0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
280b0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
280c0 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a  pies rather.  **
280d0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
280e0 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
280f0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
28100 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
28110 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66  .  ** process of
28120 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
28130 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  en..  */.  for(i
28140 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
28150 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
28160 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
28170 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69  MemPage*)aCopy[i
28180 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ];.    memcpy(p,
28190 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
281a0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
281b0 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69   p->aData = (voi
281c0 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65  d*)&p[1];.    me
281d0 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61  mcpy(p->aData, a
281e0 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20  pOld[i]->aData, 
281f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
28200 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c    }..  /*.  ** L
28210 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
28220 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
28230 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
28240 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
28250 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
28260 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
28270 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
28280 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
28290 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
282a0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
282b0 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  form aSpace1[] a
282c0 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
282d0 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
282e0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
282f0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
28300 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
28310 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
28320 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
28330 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
28340 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
28350 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
28360 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
28370 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
28380 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
28390 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
283a0 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
283b0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
283c0 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
283d0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
283e0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
283f0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
28400 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
28410 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
28420 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
28430 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
28440 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
28450 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
28460 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
28470 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
28480 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
28490 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
284a0 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
284b0 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
284c0 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
284d0 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
284e0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
284f0 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
28500 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b   */.  nCell = 0;
28510 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
28520 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a  n = pPage->leaf*
28530 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
28540 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a  pPage->hasData;.
28550 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
28560 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
28570 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
28580 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[i];.    int 
28590 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
285a0 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
285b0 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
285c0 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
285d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
285e0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
285f0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
28600 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
28610 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
28620 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
28630 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
28640 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
28650 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
28660 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
28670 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
28680 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f   a;.        aFro
28690 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 28 75 38 29 69  m[nCell] = (u8)i
286a0 3b 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;   assert( i>=0
286b0 20 26 26 20 69 3c 36 20 29 3b 0a 20 20 20 20 20   && i<6 );.     
286c0 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f     for(a=0; a<pO
286d0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61  ld->nOverflow; a
286e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
286f0 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61  f( pOld->aOvfl[a
28700 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b  ].pCell==apCell[
28710 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20  nCell] ){.      
28720 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
28730 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
28740 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28760 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28770 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
28780 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
28790 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73  1 ){.      u16 s
287a0 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
287b0 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
287c0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
287d0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
287e0 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45    /* With the LE
287f0 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61  AFDATA flag, pPa
28800 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20  rent cells hold 
28810 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61  only INTKEYs tha
28820 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  t.        ** are
28830 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b   duplicates of k
28840 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  eys on the child
28850 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64   pages.  We need
28860 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20   to remove.     
28870 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65     ** the divide
28880 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61  r cells from pPa
28890 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69  rent, but the di
288a0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65  viders cells are
288b0 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
288c0 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b  added to apCell[
288d0 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  ] because they a
288e0 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
288f0 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20   child cells..  
28900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28910 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
28920 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
28930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28940 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
28950 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
28960 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
28970 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
28980 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
28990 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
289a0 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
289b0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31  .        iSpace1
289c0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
289d0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
289e0 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
289f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
28a00 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
28a10 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
28a20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
28a30 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
28a40 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
28a50 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
28a60 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
28a70 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
28a80 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
28a90 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
28aa0 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d   0xFF;.        }
28ab0 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
28ac0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
28ad0 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
28ae0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
28af0 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66  ction==0 || leaf
28b00 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
28b10 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
28b20 6e 43 65 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c  nCell] -= (u16)l
28b30 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
28b40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67         assert( g
28b50 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d  et4byte(pTemp)==
28b60 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20  pgnoOld[i] );.  
28b70 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
28b80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
28b90 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
28ba0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
28bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28bc0 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
28bd0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
28be0 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
28bf0 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20  e left.         
28c00 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
28c10 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
28c20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
28c30 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
28c40 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
28c50 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  pOld->hdrOffset+
28c60 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  8], 4);.        
28c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28c80 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
28c90 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
28ca0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
28cb0 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20  ll[nCell]<4 ){. 
28cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
28cd0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
28ce0 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
28cf0 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
28d00 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
28d10 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
28d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28d30 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c   }.        nCell
28d40 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
28d50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
28d60 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
28d70 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
28d80 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
28d90 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
28da0 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
28db0 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
28dc0 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
28dd0 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
28de0 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
28df0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
28e00 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
28e10 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
28e20 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
28e30 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
28e40 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
28e50 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
28e60 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
28e70 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
28e80 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
28e90 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
28ea0 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
28eb0 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
28ec0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
28ed0 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
28ee0 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
28ef0 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
28f00 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
28f10 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
28f20 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
28f30 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
28f40 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
28f50 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
28f60 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
28f70 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
28f80 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
28f90 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
28fa0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
28fb0 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
28fc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
28fd0 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
28fe0 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
28ff0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
29000 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
29010 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
29020 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
29030 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
29040 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
29050 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
29060 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
29070 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
29080 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
29090 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
290a0 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
290b0 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
290c0 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
290d0 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
290e0 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
290f0 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
29100 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
29110 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
29120 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
29130 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
29140 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
29150 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
29160 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
29170 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
29180 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
29190 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
291a0 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
291b0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
291c0 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
291d0 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
291e0 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
291f0 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
29200 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
29210 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
29220 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
29230 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
29240 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
29250 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
29260 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
29270 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
29280 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
29290 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
292a0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
292b0 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
292c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
292d0 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
292e0 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
292f0 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
29300 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
29310 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
29320 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
29330 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
29340 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
29350 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
29360 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
29370 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
29380 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
29390 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
293a0 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
293b0 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
293c0 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
293d0 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
293e0 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
293f0 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
29400 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
29410 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29430 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
29440 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
29450 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
29460 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
29470 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
29480 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
29490 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
294a0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
294b0 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
294c0 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
294d0 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
294e0 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
294f0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
29500 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
29510 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
29520 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
29530 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
29540 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
29550 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
29560 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
29570 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
29580 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
29590 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
295a0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
295b0 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
295c0 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
295d0 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
295e0 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
295f0 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
29600 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
29610 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
29620 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
29630 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
29640 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
29650 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61  w[0])>0) or we a
29660 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69  re the.  ** a vi
29670 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
29680 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
29690 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
296a0 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
296b0 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
296c0 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
296d0 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
296e0 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
296f0 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
29700 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
29710 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
29720 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
29730 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
29740 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
29750 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
29760 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
29770 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
29780 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
29790 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d  );.  pageFlags =
297a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
297b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
297c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
297d0 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
297e0 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
297f0 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
29800 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
29810 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
29820 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20  = pgnoOld[i];.  
29830 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
29840 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
29850 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29860 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
29870 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
29880 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29890 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
298a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
298b0 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
298c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
298d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
298e0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
298f0 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b  New[i], pgnoNew[
29900 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  i-1], 0);.      
29910 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
29920 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
29930 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
29940 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
29950 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
29960 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
29970 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
29980 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
29990 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
299a0 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
299b0 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
299c0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
299d0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
299e0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
299f0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
29a00 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
29a10 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
29a20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
29a30 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
29a40 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
29a50 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
29a60 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
29a70 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
29a80 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
29a90 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
29aa0 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
29ab0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
29ac0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
29ad0 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
29ae0 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
29af0 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
29b00 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
29b10 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
29b20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
29b30 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
29b40 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
29b50 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
29b60 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
29b70 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
29b80 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
29b90 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
29ba0 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
29bb0 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
29bc0 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
29bd0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
29be0 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
29bf0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
29c00 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
29c10 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
29c20 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
29c30 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
29c40 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
29c50 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
29c60 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
29c70 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b  nV = pgnoNew[i];
29c80 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
29c90 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
29ca0 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
29cb0 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a     if( pgnoNew[j
29cc0 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  ]<(unsigned)minV
29cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
29ce0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
29cf0 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b  nV = pgnoNew[j];
29d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29d10 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
29d20 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20  .      int t;.  
29d30 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
29d40 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e  .      t = pgnoN
29d50 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20  ew[i];.      pT 
29d60 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
29d70 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
29d80 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20  gnoNew[minI];.  
29d90 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
29da0 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
29db0 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20    pgnoNew[minI] 
29dc0 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  = t;.      apNew
29dd0 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
29de0 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
29df0 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
29e00 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64  d %d %d  new: %d
29e10 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
29e20 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
29e30 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64  \n",.    pgnoOld
29e40 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  [0], .    nOld>=
29e50 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a  2 ? pgnoOld[1] :
29e60 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
29e70 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30  ? pgnoOld[2] : 0
29e80 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d  ,.    pgnoNew[0]
29e90 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20  , szNew[0],.    
29ea0 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65  nNew>=2 ? pgnoNe
29eb0 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[1] : 0, nNew>=
29ec0 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30  2 ? szNew[1] : 0
29ed0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20  ,.    nNew>=3 ? 
29ee0 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20  pgnoNew[2] : 0, 
29ef0 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
29f00 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
29f10 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d  >=4 ? pgnoNew[3]
29f20 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
29f30 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
29f40 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f    nNew>=5 ? pgno
29f50 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[4] : 0, nNew
29f60 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a  >=5 ? szNew[4] :
29f70 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   0));..  /*.  **
29f80 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
29f90 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
29fa0 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
29fb0 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
29fc0 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
29fd0 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
29fe0 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
29ff0 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
2a000 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
2a010 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
2a020 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
2a030 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
2a040 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
2a050 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
2a060 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
2a070 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2a080 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67  assert( pNew->pg
2a090 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29  no==pgnoNew[i] )
2a0a0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
2a0b0 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
2a0c0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2a0d0 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
2a0e0 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
2a0f0 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
2a100 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2a110 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
2a120 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
2a130 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
2a140 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
2a150 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  low==0 );..    /
2a160 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2a170 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2a180 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2a190 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
2a1a0 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  ries.    ** that
2a1b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69   point to the si
2a1c0 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
2a1d0 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65   rearranged. The
2a1e0 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a  se can be: left.
2a1f0 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20      ** children 
2a200 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69  of cells, the ri
2a210 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65  ght-child of the
2a220 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c   page, or overfl
2a230 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ow pages.    ** 
2a240 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65  pointed to by ce
2a250 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lls..    */.    
2a260 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2a270 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
2a280 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
2a290 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
2a2a0 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
2a2b0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
2a2c0 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
2a2d0 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
2a2e0 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
2a2f0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
2a300 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2a310 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
2a320 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a340 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2a350 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2a360 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2a370 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61  (pBt, get4byte(a
2a380 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41  pCell[k]), PTRMA
2a390 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
2a3a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
2a3b0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2a3c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2a3e0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2a3f0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
2a400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a410 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20  .    }..    j = 
2a420 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
2a430 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
2a440 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
2a450 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
2a460 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
2a470 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
2a480 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
2a490 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
2a4a0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
2a4b0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d  .    if( i<nNew-
2a4c0 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a  1 && j<nCell ){.
2a4d0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
2a4e0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
2a4f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
2a500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
2a510 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2a520 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
2a530 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
2a540 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
2a550 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2a560 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
2a570 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20  ace2[iSpace2];. 
2a580 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
2a590 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2a5a0 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
2a5b0 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
2a5c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
2a5d0 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20 20  SAUTOVACUUM .   
2a5e0 20 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d 5b        && (aFrom[
2a5f0 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  j]==0xFF || apCo
2a600 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67  py[aFrom[j]]->pg
2a610 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a  no!=pNew->pgno).
2a620 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2a630 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2a640 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
2a650 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50  e(pCell), PTRMAP
2a660 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
2a670 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  no);.          i
2a680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a6a0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2a6b0 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20  anup;.          
2a6c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2a6d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
2a6e0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
2a6f0 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
2a700 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
2a710 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
2a720 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
2a730 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2a740 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
2a750 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
2a760 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
2a770 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
2a780 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
2a790 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
2a7a0 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
2a7b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
2a7c0 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
2a7d0 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
2a7e0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
2a7f0 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
2a800 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
2a810 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
2a820 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73    j--;.        s
2a830 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
2a840 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
2a850 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
2a860 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2a870 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
2a880 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
2a890 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e  nt, pCell, 0, in
2a8a0 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30  fo.nKey, 0, 0, 0
2a8b0 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  , &sz);.        
2a8c0 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
2a8d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a8e0 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
2a8f0 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63      /* Obscure c
2a900 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66  ase for non-leaf
2a910 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20  -data trees: If 
2a920 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c  the cell at pCel
2a930 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a  l was.        **
2a940 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72   previously stor
2a950 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64  ed on a leaf nod
2a960 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72  e, and its repor
2a970 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20  ted size was 4. 
2a980 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c         ** bytes,
2a990 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74   then it may act
2a9a0 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72  ually be smaller
2a9b0 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20   than this .    
2a9c0 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69      ** (see sqli
2a9d0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
2a9e0 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20  lPtr(), 4 bytes 
2a9f0 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73  is the minimum s
2aa00 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ize of.        *
2aa10 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74  * any cell). But
2aa20 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
2aa30 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72   to pass the cor
2aa40 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20  rect size to .  
2aa50 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43        ** insertC
2aa60 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73  ell(), so repars
2aa70 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a  e the cell now..
2aa80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2aa90 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2aaa0 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68  this can never h
2aab0 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69  appen in an SQLi
2aac0 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73  te data file, as
2aad0 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
2aae0 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61  cells are at lea
2aaf0 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f  st 4 bytes. It o
2ab00 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62  nly happens in b
2ab10 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20  -trees used.    
2ab20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61      ** to evalua
2ab30 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e  te "IN (SELECT .
2ab40 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72  ..)" and similar
2ab50 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
2ab60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2ab70 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b   szCell[j]==4 ){
2ab80 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2ab90 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t(leafCorrection
2aba0 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==4);.          
2abb0 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
2abc0 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29  (pParent, pCell)
2abd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2abe0 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61 63 65    }.      iSpace
2abf0 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  2 += sz;.      a
2ac00 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
2ac10 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
2ac20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
2ac30 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce2<=pBt->pageSi
2ac40 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ze );.      rc =
2ac50 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
2ac60 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
2ac70 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29  l, sz, pTemp, 4)
2ac80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ac90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2aca0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2acb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2acc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2acd0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2ace0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2acf0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2ad00 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2ad10 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65  rent,nxDiv), pNe
2ad20 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 20  w->pgno);..     
2ad30 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2ad40 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2ad50 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20  tabase, and not 
2ad60 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
2ad70 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
2ad80 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2ad90 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65  er map with an e
2ada0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2adb0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
2adc0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c   ** that the cel
2add0 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20  l just inserted 
2ade0 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e  points to (if an
2adf0 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  y)..      */.   
2ae00 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2ae10 55 55 4d 20 26 26 20 21 6c 65 61 66 44 61 74 61  UUM && !leafData
2ae20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2ae30 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2ae40 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
2ae50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2ae60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ae70 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2ae80 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2ae90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2aea0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2aeb0 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  nxDiv++;.    }..
2aec0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70      /* Set the p
2aed0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2aee0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62   for the new sib
2aef0 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
2af00 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2af10 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  UM ){.      rc =
2af20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2af30 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
2af40 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
2af50 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
2af60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2af70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
2af80 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2af90 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2afa0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
2afb0 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ==nCell );.  ass
2afc0 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20  ert( nOld>0 );. 
2afd0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
2afe0 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c  );.  if( (pageFl
2aff0 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d  ags & PTF_LEAF)=
2b000 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43  =0 ){.    u8 *zC
2b010 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e  hild = &apCopy[n
2b020 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  Old-1]->aData[8]
2b030 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70  ;.    memcpy(&ap
2b040 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61  New[nNew-1]->aDa
2b050 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34  ta[8], zChild, 4
2b060 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  );.    if( ISAUT
2b070 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2b080 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2b090 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 7a 43  pBt, get4byte(zC
2b0a0 68 69 6c 64 29 2c 20 50 54 52 4d 41 50 5f 42 54  hild), PTRMAP_BT
2b0b0 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  REE, apNew[nNew-
2b0c0 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  1]->pgno);.     
2b0d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b0e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2b0f0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2b100 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
2b110 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
2b120 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2b130 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2b140 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
2b150 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e  f( nxDiv==pParen
2b160 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74  t->nCell+pParent
2b170 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2b180 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74     /* Right-most
2b190 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20   sibling is the 
2b1a0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
2b1b0 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   of pParent */. 
2b1c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2b1d0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2b1e0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2b1f0 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  ], pgnoNew[nNew-
2b200 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1]);.  }else{.  
2b210 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20    /* Right-most 
2b220 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c  sibling is the l
2b230 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65  eft child of the
2b240 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2b250 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  pParent.    ** p
2b260 61 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ast the right-mo
2b270 73 74 20 64 69 76 69 64 65 72 20 65 6e 74 72 79  st divider entry
2b280 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2b290 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2b2a0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2b2b0 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  ), pgnoNew[nNew-
2b2c0 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  1]);.  }..  /*. 
2b2d0 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20   ** Balance the 
2b2e0 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f  parent page.  No
2b2f0 74 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72  te that the curr
2b300 65 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29  ent page (pPage)
2b310 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65   might.  ** have
2b320 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74   been added to t
2b330 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69  he freelist so i
2b340 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65  t might no longe
2b350 72 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  r be initialized
2b360 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70  ..  ** But the p
2b370 61 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20  arent page will 
2b380 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61  always be initia
2b390 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  lized..  */.  as
2b3a0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
2b3b0 73 49 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74  sInit );.  sqlit
2b3c0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
2b3d0 43 65 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20  Cell);.  apCell 
2b3e0 3d 20 30 3b 0a 20 20 54 52 41 43 45 28 28 22 42  = 0;.  TRACE(("B
2b3f0 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
2b400 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64   with %d: old=%d
2b410 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
2b420 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
2b430 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64  Page->pgno, nOld
2b440 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
2b450 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
2b460 6c 6f 77 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  low = 0;.  relea
2b470 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2b480 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
2b490 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2b4a0 43 75 72 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a  Cur, 0);.  .  /*
2b4b0 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
2b4c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2b4d0 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
2b4e0 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 50  anup:.  sqlite3P
2b4f0 61 67 65 46 72 65 65 28 61 53 70 61 63 65 32 29  ageFree(aSpace2)
2b500 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  ;.  sqlite3Scrat
2b510 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
2b520 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2b530 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
2b540 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
2b550 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
2b560 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2b570 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2b580 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
2b590 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2b5a0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
2b5b0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 72  erflow = 0;..  r
2b5c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b5d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b5e0 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
2b5f0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
2b600 20 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20   btree when the 
2b610 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e  root.** page con
2b620 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
2b630 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f   This is an oppo
2b640 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  rtunity to make 
2b650 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c  the tree.** shal
2b660 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76  lower by one lev
2b670 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
2b680 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  t balance_shallo
2b690 77 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wer(BtCursor *pC
2b6a0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2b6b0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
2b6c0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2b6d0 20 6f 66 20 42 2d 54 72 65 65 20 2a 2f 0a 20 20   of B-Tree */.  
2b6e0 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b700 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70  The only child p
2b710 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  age of pPage */.
2b720 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2b730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b740 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
2b750 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e  r pChild */.  in
2b760 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b770 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
2b780 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
2b790 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
2b7a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7c0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54    /* The main BT
2b7d0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
2b7e0 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72  .  int mxCellPer
2b7f0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2b800 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2b810 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70  r of cells per p
2b820 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2b830 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2b840 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
2b850 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
2b860 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
2b870 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20    u16 *szCell;  
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b890 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
2b8a0 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
2b8b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2b8c0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  age==0 );.  pPag
2b8d0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2b8e0 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [0];..  assert( 
2b8f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2b900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b910 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b920 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2b930 78 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  x) );.  pBt = pP
2b940 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65  age->pBt;.  mxCe
2b950 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43  llPerPage = MX_C
2b960 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65  ELL(pBt);.  apCe
2b970 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ll = sqlite3Mall
2b980 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  oc( mxCellPerPag
2b990 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73  e*(sizeof(u8*)+s
2b9a0 69 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a 20  izeof(u16)) );. 
2b9b0 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
2b9c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2b9d0 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d  OMEM;.  szCell =
2b9e0 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d   (u16*)&apCell[m
2b9f0 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20  xCellPerPage];. 
2ba00 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2ba10 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
2ba20 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  able is complete
2ba30 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20  ly empty */.    
2ba40 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2ba50 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c   empty table %d\
2ba60 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  n", pPage->pgno)
2ba70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ba80 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
2ba90 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61   is empty but ha
2baa0 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72  s one child.  Tr
2bab0 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a  ansfer the.    *
2bac0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
2bad0 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c  om that one chil
2bae0 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20  d into the root 
2baf0 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20  page if it .    
2bb00 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68  ** will fit.  Th
2bb10 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64  is reduces the d
2bb20 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
2bb30 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a   by one..    **.
2bb40 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f      ** If the ro
2bb50 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ot page is page 
2bb60 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73  1, it has less s
2bb70 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74  pace available t
2bb80 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63  han.    ** its c
2bb90 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65  hild (due to the
2bba0 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72   100 byte header
2bbb0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
2bbc0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
2bbd0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
2bbe0 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74  base fle), so it
2bbf0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62   might not be ab
2bc00 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f  le to hold all o
2bc10 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e  f the .    ** in
2bc20 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e  formation curren
2bc30 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  tly contained in
2bc40 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20   the child.  If 
2bc50 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20  this is the .   
2bc60 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64   ** case, then d
2bc70 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61  o not do the tra
2bc80 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61  nsfer.  Leave pa
2bc90 67 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70  ge 1 empty excep
2bca0 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  t.    ** for the
2bcb0 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74   right-pointer t
2bcc0 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  o the child page
2bcd0 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67  .  The child pag
2bce0 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a  e becomes.    **
2bcf0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
2bd00 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20  t of the tree.. 
2bd10 20 20 20 2a 2f 0a 20 20 20 20 56 56 41 5f 4f 4e     */.    VVA_ON
2bd20 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53  LY( pCur->pagesS
2bd30 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20  huffled = 1 );. 
2bd40 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67     pgnoChild = g
2bd50 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2bd60 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2bd70 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2bd80 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
2bd90 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d>0 );.    asser
2bda0 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61  t( pgnoChild<=pa
2bdb0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2bdc0 67 65 2d 3e 70 42 74 29 20 29 3b 0a 20 20 20 20  ge->pBt) );.    
2bdd0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2bde0 65 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e  eGetPage(pPage->
2bdf0 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
2be00 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20  &pChild, 0);.   
2be10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2be20 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2be30 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ce;.    if( pPag
2be40 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  e->pgno==1 ){.  
2be50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2be60 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43  BtreeInitPage(pC
2be70 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 69 66 28  hild);.      if(
2be80 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73   rc ) goto end_s
2be90 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
2bea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2beb0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  hild->nOverflow=
2bec0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2bed0 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31  pChild->nFree>=1
2bee0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  00 ){.        /*
2bef0 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72   The child infor
2bf00 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20  mation will fit 
2bf10 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  on the root page
2bf20 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20  , so do the.    
2bf30 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20      ** copy */. 
2bf40 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
2bf50 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70        zeroPage(p
2bf60 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Page, pChild->aD
2bf70 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  ata[0]);.       
2bf80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69   for(i=0; i<pChi
2bf90 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ld->nCell; i++){
2bfa0 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65 6c  .          apCel
2bfb0 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  l[i] = findCell(
2bfc0 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20  pChild,i);.     
2bfd0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d       szCell[i] =
2bfe0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68   cellSizePtr(pCh
2bff0 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b  ild, apCell[i]);
2c000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c010 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
2c020 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e  pPage, pChild->n
2c030 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a  Cell, apCell, sz
2c040 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f  Cell);.        /
2c050 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74  * Copy the right
2c060 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20  -pointer of the 
2c070 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72  child to the par
2c080 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ent. */.        
2c090 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2c0a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2c0b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2c0c0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
2c0d0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2c0e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2c0f0 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20  et+8], .        
2c100 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43      get4byte(&pC
2c110 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69  hild->aData[pChi
2c120 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
2c130 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
2c140 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64   freePage(pChild
2c150 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
2c160 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
2c170 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f  d %d transfer to
2c180 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
2c190 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
2c1a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c1b0 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61   /* The child ha
2c1c0 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  s more informati
2c1d0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  on that will fit
2c1e0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20   on the root..  
2c1f0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65        ** The tre
2c200 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c  e is already bal
2c210 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69  anced.  Do nothi
2c220 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  ng. */.        T
2c230 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2c240 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f  child %d will no
2c250 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c  t fit on page 1\
2c260 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
2c270 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2c280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
2c290 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61  cpy(pPage->aData
2c2a0 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c  , pChild->aData,
2c2b0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2c2c0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
2c2d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
2c2e0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
2c2f0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2c300 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2c310 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2c320 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
2c330 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
2c340 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
2c350 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65  BALANCE: transfe
2c360 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20  r child %d into 
2c370 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20  root %d\n",.    
2c380 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64            pChild
2c390 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70  ->pgno, pPage->p
2c3a0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
2c3b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c3c0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2c3d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c3e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2c3f0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2c400 55 55 4d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  UUM && rc==SQLIT
2c410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2c420 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
2c430 70 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ps(pPage);.    }
2c440 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65  .#endif.    rele
2c450 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
2c460 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77  .  }.end_shallow
2c470 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69  _balance:.  sqli
2c480 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29  te3_free(apCell)
2c490 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c4a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f  .../*.** The roo
2c4b0 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  t page is overfu
2c4c0 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ll.**.** When th
2c4d0 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61  is happens, Crea
2c4e0 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  te a new child p
2c4f0 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65  age and copy the
2c500 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
2c510 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68  the root into th
2c520 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d  e child.  Then m
2c530 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  ake the root.** 
2c540 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61  page an empty pa
2c550 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69  ge with rightChi
2c560 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ld pointing to t
2c570 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e  he new.** child.
2c580 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c     Finally, call
2c590 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61   balance_interna
2c5a0 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63  l() on the new c
2c5b0 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65  hild.** to cause
2c5c0 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f   it to split..*/
2c5d0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2c5e0 6e 63 65 5f 64 65 65 70 65 72 28 42 74 43 75 72  nce_deeper(BtCur
2c5f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2c600 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2c610 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
2c620 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
2c630 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ures */.  MemPag
2c640 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 2f 2a  e *pPage;     /*
2c650 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
2c660 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 4d  root page */.  M
2c670 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
2c680 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2c690 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
2c6a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2c6b0 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61  Child;     /* Pa
2c6c0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2c6d0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2c6e0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
2c6f0 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt;         /* T
2c700 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e  he BTree */.  in
2c710 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
2c720 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c    /* Total usabl
2c730 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
2c740 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
2c750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2c760 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65  tent of the pare
2c770 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  nt page */.  u8 
2c780 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20  *cdata;         
2c790 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
2c7a0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  he child page */
2c7b0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
2c7c0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2c7d0 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
2c7e0 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69  in parent */.  i
2c7f0 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
2c800 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2c810 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74  content of first
2c820 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20   cell in parent 
2c830 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
2c840 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a  ur->iPage==0 );.
2c850 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c860 61 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72  apPage[0]->nOver
2c870 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 56 56 41  flow>0 );..  VVA
2c880 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
2c890 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29  esShuffled = 1 )
2c8a0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2c8b0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 70  ->apPage[0];.  p
2c8c0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2c8d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c8e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2c8f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2c900 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2c910 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2c920 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2c930 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  ;.  rc = allocat
2c940 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2c950 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68  &pChild, &pgnoCh
2c960 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ild, pPage->pgno
2c970 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2c980 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
2c990 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2c9a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
2c9b0 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
2c9c0 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
2c9d0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2c9e0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
2c9f0 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
2ca00 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2ca10 74 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  t;.  cbrk = get2
2ca20 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2ca30 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43  ]);.  cdata = pC
2ca40 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  hild->aData;.  m
2ca50 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61  emcpy(cdata, &da
2ca60 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e  ta[hdr], pPage->
2ca70 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
2ca80 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a  ge->nCell-hdr);.
2ca90 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b    memcpy(&cdata[
2caa0 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72  cbrk], &data[cbr
2cab0 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 63  k], usableSize-c
2cac0 62 72 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  brk);..  assert(
2cad0 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d   pChild->isInit=
2cae0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
2caf0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2cb00 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28  e(pChild);.  if(
2cb10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cb20 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20  {.    int nCopy 
2cb30 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2cb40 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  ow*sizeof(pPage-
2cb50 3e 61 4f 76 66 6c 5b 30 5d 29 3b 0a 20 20 20 20  >aOvfl[0]);.    
2cb60 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
2cb70 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76  Ovfl, pPage->aOv
2cb80 66 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  fl, nCopy);.    
2cb90 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2cba0 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  w = pPage->nOver
2cbb0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 43  flow;.    if( pC
2cbc0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2cbd0 29 7b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  ){.      pChild-
2cbe0 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  >nFree = 0;.    
2cbf0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2cc00 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
2cc10 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2cc20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2cc30 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2cc40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2cc50 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
2cc60 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2cc70 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
2cc80 4c 45 41 46 29 3b 0a 20 20 20 20 70 75 74 34 62  LEAF);.    put4b
2cc90 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2cca0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2ccb0 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64  et+8], pgnoChild
2ccc0 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 42  );.    TRACE(("B
2ccd0 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f  ALANCE: copy roo
2cce0 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c  t %d into %d\n",
2ccf0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43   pPage->pgno, pC
2cd00 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
2cd10 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2cd20 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  UM ){.      rc =
2cd30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2cd40 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54  pChild->pgno, PT
2cd50 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67  RMAP_BTREE, pPag
2cd60 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  e->pgno);.#ifnde
2cd70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2cd80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
2cd90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cda0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2cdb0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
2cdc0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2cdd0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
2cde0 7b 0a 20 20 20 20 20 20 20 20 70 43 68 69 6c 64  {.        pChild
2cdf0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
2ce00 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2ce10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2ce20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ce30 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  {.    pCur->iPag
2ce40 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  e++;.    pCur->a
2ce50 70 50 61 67 65 5b 31 5d 20 3d 20 70 43 68 69 6c  pPage[1] = pChil
2ce60 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  d;.    pCur->aiI
2ce70 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72  dx[0] = 0;.    r
2ce80 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
2ce90 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  oot(pCur);.  }el
2cea0 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
2ceb0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d  age(pChild);.  }
2cec0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2ced0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
2cee0 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65   that pCur curre
2cef0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68  ntly points to h
2cf00 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64  as just been mod
2cf10 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65  ified in.** some
2cf20 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74   way. This funct
2cf30 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20  ion figures out 
2cf40 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61  if this modifica
2cf50 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a  tion means the.*
2cf60 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  * tree needs to 
2cf70 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64  be balanced, and
2cf80 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65   if so calls the
2cf90 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
2cfa0 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69  ancing .** routi
2cfb0 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61 6d  ne..** .** Param
2cfc0 65 74 65 72 20 69 73 49 6e 73 65 72 74 20 69 73  eter isInsert is
2cfd0 20 74 72 75 65 20 69 66 20 61 20 6e 65 77 20 63   true if a new c
2cfe0 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e 73  ell was just ins
2cff0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 0a 2a  erted into the.*
2d000 2a 20 70 61 67 65 2c 20 6f 72 20 66 61 6c 73 65  * page, or false
2d010 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
2d020 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2d030 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
2d040 2c 20 69 6e 74 20 69 73 49 6e 73 65 72 74 29 7b  , int isInsert){
2d050 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d060 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2d070 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2d080 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d090 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge];..  assert( 
2d0a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2d0b0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2d0c0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
2d0d0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2d0e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d0f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2d100 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2d110 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d120 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
2d130 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
2d140 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
2d150 65 65 70 65 72 28 70 43 75 72 29 3b 0a 20 20 20  eeper(pCur);.   
2d160 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2d170 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67  >apPage[0]==pPag
2d180 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
2d190 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2d1a0 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51  low==0 || rc!=SQ
2d1b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
2d1c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d1d0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
2d1e0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
2d1f0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2d200 73 68 61 6c 6c 6f 77 65 72 28 70 43 75 72 29 3b  shallower(pCur);
2d210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d220 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d  Cur->apPage[0]==
2d230 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 61  pPage );.      a
2d240 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2d250 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63  verflow==0 || rc
2d260 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2d270 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2d280 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2d290 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20  erflow>0 || .   
2d2a0 20 20 20 20 20 28 21 69 73 49 6e 73 65 72 74 20       (!isInsert 
2d2b0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
2d2c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2d2d0 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20  leSize*2/3) ){. 
2d2e0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2d2f0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b  e_nonroot(pCur);
2d300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2d310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d320 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
2d330 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
2d340 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
2d350 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
2d360 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
2d370 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
2d380 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
2d390 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
2d3a0 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
2d3b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
2d3c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2d3d0 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
2d3e0 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
2d3f0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
2d400 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
2d410 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
2d420 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
2d430 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
2d440 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
2d450 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
2d460 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
2d470 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
2d480 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20  *.** As well as 
2d490 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46  cursors with wrF
2d4a0 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20  lag==0, cursors 
2d4b0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 61  with wrFlag==1 a
2d4c0 6e 64 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f  nd .** isIncrblo
2d4d0 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61  bHandle==1 are a
2d4e0 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27  lso considered '
2d4f0 72 65 61 64 27 20 63 75 72 73 6f 72 73 2e 20 49  read' cursors. I
2d500 6e 63 72 65 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62  ncremental .** b
2d510 6c 6f 62 20 63 75 72 73 6f 72 73 20 61 72 65 20  lob cursors are 
2d520 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65  used for both re
2d530 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
2d540 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67  g..**.** When pg
2d550 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f  noRoot is the ro
2d560 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e  ot page of an in
2d570 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73  tkey table, this
2d580 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
2d590 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65  o.** responsible
2d5a0 20 66 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e   for invalidatin
2d5b0 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  g incremental bl
2d5c0 6f 62 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20  ob cursors when 
2d5d0 74 68 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a  the table row.**
2d5e0 20 6f 6e 20 77 68 69 63 68 20 74 68 65 79 20 61   on which they a
2d5f0 72 65 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c  re opened is del
2d600 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64  eted or modified
2d610 2e 20 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e  . Cursors are in
2d620 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63  validated.** acc
2d630 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f  ording to the fo
2d640 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  llowing rules:.*
2d650 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42  *.**   1) When B
2d660 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
2d670 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
2d680 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20  mpletely delete 
2d690 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
2d6a0 20 20 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65       of a B-Tree
2d6b0 20 74 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65   table, pExclude
2d6c0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20   is set to zero 
2d6d0 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52  and parameter iR
2d6e0 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73  ow is .**      s
2d6f0 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  et to non-zero. 
2d700 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
2d710 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2d720 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a  b cursors open.*
2d730 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61  *      on the ta
2d740 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67  ble rooted at pg
2d750 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c  noRoot are inval
2d760 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2d770 32 29 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73  2) When BtreeIns
2d780 65 72 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65  ert(), BtreeDele
2d790 74 65 28 29 20 6f 72 20 42 74 72 65 65 50 75 74  te() or BtreePut
2d7a0 44 61 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64  Data() is called
2d7b0 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64   to .**      mod
2d7c0 69 66 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20  ify a table row 
2d7d0 76 69 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65  via an SQL state
2d7e0 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69  ment, pExclude i
2d7f0 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2d800 20 20 20 20 20 20 77 72 69 74 65 20 63 75 72 73        write curs
2d810 6f 72 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68  or used to do th
2d820 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61  e modification a
2d830 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f  nd parameter iRo
2d840 77 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20  w is set.**     
2d850 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20   to the integer 
2d860 72 6f 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d  row id of the B-
2d870 54 72 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67  Tree entry being
2d880 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73   modified. Unles
2d890 73 0a 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75  s.**      pExclu
2d8a0 64 65 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20  de is itself an 
2d8b0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2d8c0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c   cursor, then al
2d8d0 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  l incremental.**
2d8e0 20 20 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f        blob curso
2d8f0 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69  rs open on row i
2d900 52 6f 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65  Row of the B-Tre
2d910 65 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  e are invalidate
2d920 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66  d..**.**   3) If
2d930 20 62 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61   both pExclude a
2d940 6e 64 20 69 52 6f 77 20 61 72 65 20 73 65 74 20  nd iRow are set 
2d950 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72  to zero, no incr
2d960 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a  emental blob .**
2d970 20 20 20 20 20 20 63 75 72 73 6f 72 73 20 61 72        cursors ar
2d980 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
2d990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
2d9a0 63 6b 52 65 61 64 4c 6f 63 6b 73 28 0a 20 20 42  ckReadLocks(.  B
2d9b0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 0a 20  tree *pBtree, . 
2d9c0 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20   Pgno pgnoRoot, 
2d9d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
2d9e0 63 6c 75 64 65 2c 0a 20 20 69 36 34 20 69 52 6f  clude,.  i64 iRo
2d9f0 77 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  w.){.  BtCursor 
2da00 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
2da10 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
2da20 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2da30 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20   = pBtree->db;. 
2da40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2da50 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2da60 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72  pBtree) );.  for
2da70 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
2da80 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
2da90 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63  .    if( p==pExc
2daa0 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lude ) continue;
2dab0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
2dac0 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
2dad0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
2dae0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2daf0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20  NCRBLOB.    if( 
2db00 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
2db10 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20  dle && ( .      
2db20 20 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26     (!pExclude &&
2db30 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20   iRow).      || 
2db40 28 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45  (pExclude && !pE
2db50 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c  xclude->isIncrbl
2db60 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69  obHandle && p->i
2db70 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a  nfo.nKey==iRow).
2db80 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d      )){.      p-
2db90 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2dba0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a  _INVALID;.    }.
2dbb0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
2dbc0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2dbd0 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75  _VALID ) continu
2dbe0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72  e;.    if( p->wr
2dbf0 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66  Flag==0 .#ifndef
2dc00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2dc10 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d  RBLOB.     || p-
2dc20 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2dc30 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  e.#endif.    ){.
2dc40 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2dc50 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72  bOther = p->pBtr
2dc60 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 69 66  ee->db;.      if
2dc70 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a  ( dbOther==0 ||.
2dc80 20 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65           (dbOthe
2dc90 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65  r!=db && (dbOthe
2dca0 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  r->flags & SQLIT
2dcb0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2dcc0 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  d)==0) ){.      
2dcd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2dce0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a  LOCKED;.      }.
2dcf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2dd00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2dd10 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2dd20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
2dd30 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20  the BTree.  The 
2dd40 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  key is given by 
2dd50 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61  (pKey,nKey).** a
2dd60 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67  nd the data is g
2dd70 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e  iven by (pData,n
2dd80 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73  Data).  The curs
2dd90 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
2dda0 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61  to.** define wha
2ddb0 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f  t table the reco
2ddc0 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rd should be ins
2ddd0 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65  erted into.  The
2dde0 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
2ddf0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2de00 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
2de10 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49  ..**.** For an I
2de20 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c  NTKEY table, onl
2de30 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65  y the nKey value
2de40 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75   of the key is u
2de50 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
2de60 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61   ignored.  For a
2de70 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c   ZERODATA table,
2de80 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e   the pData and n
2de90 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67  Data are both ig
2dea0 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  nored..*/.int sq
2deb0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
2dec0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
2ded0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
2dee0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
2def0 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
2df00 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
2df10 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2df20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2df30 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
2df40 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2df50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2df60 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
2df70 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta,  /* The data
2df80 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
2df90 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  rd */.  int nZer
2dfa0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
2dfb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2dfc0 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65   of extra 0 byte
2dfd0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64  s to append to d
2dfe0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70  ata */.  int app
2dff0 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20 20  endBias         
2e000 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e010 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c  if this is likel
2e020 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29  y an append */.)
2e030 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2e040 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e  t loc;.  int szN
2e050 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  ew;.  int idx;. 
2e060 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2e070 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
2e080 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
2e090 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2e0a0 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
2e0b0 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a   char *oldCell;.
2e0c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e0d0 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20  *newCell = 0;.. 
2e0e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2e0f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2e100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
2e110 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2e120 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2e130 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2e140 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73  readOnly );.  as
2e150 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c  sert( pCur->wrFl
2e160 61 67 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63  ag );.  if( chec
2e170 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d  kReadLocks(pCur-
2e180 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
2e190 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e  gnoRoot, pCur, n
2e1a0 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Key) ){.    retu
2e1b0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2e1c0 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2e1d0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2e1e0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2e1f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
2e200 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2e210 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
2e220 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
2e230 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
2e240 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
2e250 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
2e260 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
2e270 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
2e280 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
2e290 72 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a  r(pCur);.  if( .
2e2a0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
2e2b0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2e2c0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2e2d0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20  gnoRoot, pCur)) 
2e2e0 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ||.    SQLITE_OK
2e2f0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
2e300 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
2e310 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
2e320 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
2e330 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2e340 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
2e350 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2e360 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e370 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2e380 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
2e390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2e3a0 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
2e3b0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
2e3c0 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
2e3d0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
2e3e0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
2e3f0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
2e400 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2e410 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
2e420 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
2e430 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
2e440 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
2e450 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
2e460 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e470 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
2e480 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
2e490 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
2e4a0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
2e4b0 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
2e4c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2e4d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
2e4e0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
2e4f0 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
2e500 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
2e510 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
2e520 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2e530 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2e540 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2e550 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2e560 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2e570 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2e580 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2e590 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
2e5a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e5b0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
2e5c0 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
2e5d0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2e5e0 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ate ){.    u16 s
2e5f0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
2e600 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
2e610 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
2e620 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e630 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e640 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2e650 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
2e660 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
2e670 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
2e680 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
2e690 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2e6a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
2e6b0 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
2e6c0 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
2e6d0 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
2e6e0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2e6f0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
2e700 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2e710 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2e720 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2e730 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
2e740 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70   rc = dropCell(p
2e750 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64  Page, idx, szOld
2e760 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2e770 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
2e780 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
2e790 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rt;.    }.  }els
2e7a0 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
2e7b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
2e7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e7d0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
2e7e0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
2e7f0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2e800 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
2e810 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2e820 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
2e830 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2e840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e850 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
2e860 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2e870 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65  Page, idx, newCe
2e880 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29  ll, szNew, 0, 0)
2e890 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2e8a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2e8b0 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
2e8c0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 75  1);.  }..  /* Mu
2e8d0 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76  st make sure nOv
2e8e0 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20  erflow is reset 
2e8f0 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20  to zero even if 
2e900 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20 20  the balance().  
2e910 2a 2a 20 66 61 69 6c 73 2e 20 20 49 6e 74 65 72  ** fails.  Inter
2e920 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
2e930 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  re corruption wi
2e940 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72 77  ll result otherw
2e950 69 73 65 2e 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  ise. */.  pCur->
2e960 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e970 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ge]->nOverflow =
2e980 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   0;..  if( rc==S
2e990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e9a0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2e9b0 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74  ;.  }.end_insert
2e9c0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
2e9d0 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2e9e0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
2e9f0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
2ea00 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
2ea10 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
2ea20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72  pointing at a ar
2ea30 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e  bitrary location
2ea40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ea50 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43 75  BtreeDelete(BtCu
2ea60 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
2ea70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2ea80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2ea90 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74  r->iPage];.  int
2eaa0 20 69 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64   idx;.  unsigned
2eab0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20   char *pCell;.  
2eac0 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70  int rc;.  Pgno p
2ead0 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  gnoChild = 0;.  
2eae0 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
2eaf0 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
2eb00 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2eb10 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
2eb20 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2eb30 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2eb40 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2eb50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
2eb60 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2eb70 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2eb80 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2eb90 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2eba0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ebb0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2ebc0 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2ebd0 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28  >skip;.  }.  if(
2ebe0 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49   NEVER(pCur->aiI
2ebf0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
2ec00 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 20 29  =pPage->nCell) )
2ec10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ec20 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
2ec30 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2ec40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
2ec50 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 61  thing */.  }.  a
2ec60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
2ec70 6c 61 67 20 29 3b 0a 20 20 69 66 28 20 63 68 65  lag );.  if( che
2ec80 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72  ckReadLocks(pCur
2ec90 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e  ->pBtree, pCur->
2eca0 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20  pgnoRoot, pCur, 
2ecb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
2ecc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ecd0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a  QLITE_LOCKED; /*
2ece0 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
2ecf0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
2ed00 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  read lock */.  }
2ed10 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74  ..  /* Restore t
2ed20 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
2ed30 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f  r position (a no
2ed40 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f  -op if the curso
2ed50 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a  r is not in .  *
2ed60 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  * CURSOR_REQUIRE
2ed70 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20  SEEK state) and 
2ed80 73 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  save the positio
2ed90 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
2eda0 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70  cursors .  ** op
2edb0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  en on the same t
2edc0 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20  able. Then call 
2edd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ede0 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  e() on the page.
2edf0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e    ** that the en
2ee00 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  try will be dele
2ee10 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20  ted from..  */. 
2ee20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20   if( .    (rc = 
2ee30 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2ee40 69 74 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20  ition(pCur))!=0 
2ee50 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76  ||.    (rc = sav
2ee60 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
2ee70 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2ee80 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20   pCur))!=0 ||.  
2ee90 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50    (rc = sqlite3P
2eea0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2eeb0 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20  >pDbPage))!=0.  
2eec0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2eed0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
2eee0 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  te the cell with
2eef0 69 6e 20 69 74 73 20 70 61 67 65 20 61 6e 64 20  in its page and 
2ef00 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e  leave pCell poin
2ef10 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ting to the.  **
2ef20 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72   data. The clear
2ef30 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65  Cell() call free
2ef40 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  s any overflow p
2ef50 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
2ef60 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65  with the.  ** ce
2ef70 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73  ll. The cell its
2ef80 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74  elf is still int
2ef90 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 64 78 20  act..  */.  idx 
2efa0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
2efb0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 70 43  ur->iPage];.  pC
2efc0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2efd0 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 69 66  Page, idx);.  if
2efe0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2eff0 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20  {.    pgnoChild 
2f000 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
2f010 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c  );.  }.  rc = cl
2f020 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
2f030 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20  Cell);.  if( rc 
2f040 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2f050 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
2f060 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f070 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65   /*.    ** The e
2f080 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75  ntry we are abou
2f090 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e  t to delete is n
2f0a0 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20  ot a leaf so if 
2f0b0 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  we do not.    **
2f0c0 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65   do something we
2f0d0 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f   will leave a ho
2f0e0 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61  le on an interna
2f0f0 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57  l page..    ** W
2f100 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74  e have to fill t
2f110 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e  he hole by movin
2f120 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d  g in a cell from
2f130 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20   a leaf.  The.  
2f140 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61    ** next Cell a
2f150 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20  fter the one to 
2f160 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75  be deleted is gu
2f170 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
2f180 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20  t and.    ** to 
2f190 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20  be a leaf so we 
2f1a0 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  can use it..    
2f1b0 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  */.    BtCursor 
2f1c0 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 4d 65 6d  leafCur;.    Mem
2f1d0 50 61 67 65 20 2a 70 4c 65 61 66 50 61 67 65 20  Page *pLeafPage 
2f1e0 3d 20 30 3b 0a 0a 20 20 20 20 75 6e 73 69 67 6e  = 0;..    unsign
2f1f0 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a  ed char *pNext;.
2f200 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b      int notUsed;
2f210 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2f220 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30  ar *tempCell = 0
2f230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
2f240 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
2f250 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2f260 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43  GetTempCursor(pC
2f270 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20  ur, &leafCur);. 
2f280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2f290 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
2f2a0 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
2f2b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f2c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2f2d0 65 72 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49  ert( leafCur.aiI
2f2e0 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65  dx[leafCur.iPage
2f2f0 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c  ]==0 );.      pL
2f300 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75  eafPage = leafCu
2f310 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72  r.apPage[leafCur
2f320 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 72  .iPage];.      r
2f330 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f340 57 72 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d  Write(pLeafPage-
2f350 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
2f360 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2f370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f380 69 6e 74 20 6c 65 61 66 43 75 72 73 6f 72 49 6e  int leafCursorIn
2f390 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  valid = 0;.     
2f3a0 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20   u16 szNext;.   
2f3b0 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
2f3c0 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
2f3d0 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d  te internal from
2f3e0 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d   %d replace from
2f3f0 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2f400 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2f410 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2f420 6f 2c 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67  o, pLeafPage->pg
2f430 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
2f440 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
2f450 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2f460 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2f470 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
2f480 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30  ell(pLeafPage, 0
2f490 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20  );.      szNext 
2f4a0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c  = cellSizePtr(pL
2f4b0 65 61 66 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  eafPage, pNext);
2f4c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2f4d0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2f4e0 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2f4f0 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
2f500 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
2f510 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74    tempCell = pBt
2f520 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
2f530 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d     if( tempCell=
2f540 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2f550 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2f560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f570 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f580 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2f590 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2f5a0 65 2c 20 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  e, idx, pNext-4,
2f5b0 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2f5c0 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ell, 0);.      }
2f5d0 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ...      /* The 
2f5e0 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69  "if" statement i
2f5f0 6e 20 74 68 65 20 6e 65 78 74 20 63 6f 64 65 20  n the next code 
2f600 62 6c 6f 63 6b 20 69 73 20 63 72 69 74 69 63 61  block is critica
2f610 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  l.  The.      **
2f620 20 73 6c 69 67 68 74 65 73 74 20 65 72 72 6f 72   slightest error
2f630 20 69 6e 20 74 68 61 74 20 73 74 61 74 65 6d 65   in that stateme
2f640 6e 74 20 77 6f 75 6c 64 20 61 6c 6c 6f 77 20 53  nt would allow S
2f650 51 4c 69 74 65 20 74 6f 20 6f 70 65 72 61 74 65  QLite to operate
2f660 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  .      ** correc
2f670 74 6c 79 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  tly most of the 
2f680 74 69 6d 65 20 62 75 74 20 70 72 6f 64 75 63 65  time but produce
2f690 20 76 65 72 79 20 72 61 72 65 20 66 61 69 6c 75   very rare failu
2f6a0 72 65 73 2e 20 20 54 6f 0a 20 20 20 20 20 20 2a  res.  To.      *
2f6b0 2a 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  * guard against 
2f6c0 74 68 69 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  this, the follow
2f6d0 69 6e 67 20 6d 61 63 72 6f 73 20 68 65 6c 70 20  ing macros help 
2f6e0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 0a 20  to verify that. 
2f6f0 20 20 20 20 20 2a 2a 20 74 68 65 20 22 69 66 22       ** the "if"
2f700 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 77 65   statement is we
2f710 6c 6c 20 74 65 73 74 65 64 2e 0a 20 20 20 20 20  ll tested..     
2f720 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
2f730 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
2f740 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
2f750 2d 3e 6e 46 72 65 65 3c 70 42 74 2d 3e 75 73 61  ->nFree<pBt->usa
2f760 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20  bleSize*2/3 .   
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2f780 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
2f790 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
2f7a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2f7b0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2f7c0 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
2f7d0 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
2f7e0 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
2f7f0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20  ableSize*2/3 .  
2f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2f810 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72  & pLeafPage->nFr
2f820 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42  ee+2+szNext > pB
2f830 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2f840 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  3 );.      testc
2f850 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ase( pPage->nOve
2f860 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67  rflow==0 && pPag
2f870 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75  e->nFree==pBt->u
2f880 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20  sableSize*2/3+1 
2f890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f8a0 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e    && pLeafPage->
2f8b0 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e  nFree+2+szNext >
2f8c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2f8d0 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65  *2/3 );.      te
2f8e0 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
2f8f0 4f 76 65 72 66 6c 6f 77 3e 30 20 26 26 20 70 50  Overflow>0 && pP
2f900 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 70 42 74 2d  age->nFree<=pBt-
2f910 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 0a  >usableSize*2/3.
2f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f930 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
2f940 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20  Free+2+szNext > 
2f950 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2f960 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73  2/3 );.      tes
2f970 74 63 61 73 65 28 20 28 70 50 61 67 65 2d 3e 6e  tcase( (pPage->n
2f980 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70  Overflow>0 || (p
2f990 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42  Page->nFree > pB
2f9a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2f9b0 33 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  3)).            
2f9c0 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
2f9d0 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
2f9e0 74 20 3d 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  t == pBt->usable
2f9f0 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20  Size*2/3 );...  
2fa00 20 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e      if( (pPage->
2fa10 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28  nOverflow>0 || (
2fa20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70  pPage->nFree > p
2fa30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2fa40 2f 33 29 29 20 26 26 0a 20 20 20 20 20 20 20 20  /3)) &&.        
2fa50 20 20 28 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46    (pLeafPage->nF
2fa60 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70  ree+2+szNext > p
2fa70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2fa80 2f 33 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  /3).      ){.   
2fa90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2faa0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
2fab0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2fac0 65 20 69 73 20 6e 6f 77 20 65 69 74 68 65 72 20  e is now either 
2fad0 6f 76 65 72 66 6c 6f 77 69 6e 67 0a 20 20 20 20  overflowing.    
2fae0 20 20 20 20 2a 2a 20 6f 72 20 75 6e 64 65 72 66      ** or underf
2faf0 75 6c 6c 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ull and the leaf
2fb00 20 6e 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 6e   node will be un
2fb10 64 65 72 66 75 6c 6c 20 61 66 74 65 72 20 74 68  derfull after th
2fb20 65 20 6a 75 73 74 20 63 65 6c 6c 20 0a 20 20 20  e just cell .   
2fb30 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 74       ** copied t
2fb40 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  o the internal n
2fb50 6f 64 65 20 69 73 20 64 65 6c 65 74 65 64 20 66  ode is deleted f
2fb60 72 6f 6d 20 69 74 2e 20 54 68 69 73 20 69 73 20  rom it. This is 
2fb70 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20  a special.      
2fb80 20 20 2a 2a 20 63 61 73 65 20 62 65 63 61 75 73    ** case becaus
2fb90 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 61  e the call to ba
2fba0 6c 61 6e 63 65 28 29 20 74 6f 20 63 6f 72 72 65  lance() to corre
2fbb0 63 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ct the internal 
2fbc0 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  node.        ** 
2fbd0 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65 20 74  may change the t
2fbe0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
2fbf0 64 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  d invalidate the
2fc00 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 20 20 20   contents of.   
2fc10 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66       ** the leaf
2fc20 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
2fc30 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
2fc40 20 61 72 72 61 79 73 2c 20 77 68 69 63 68 20 77   arrays, which w
2fc50 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
2fc60 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 62 61  * used by the ba
2fc70 6c 61 6e 63 65 28 29 20 72 65 71 75 69 72 65 64  lance() required
2fc80 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20   to correct the 
2fc90 75 6e 64 65 72 66 75 6c 6c 20 6c 65 61 66 0a 20  underfull leaf. 
2fca0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a         ** node..
2fcb0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2fcc0 20 20 20 2a 2a 20 54 68 65 20 66 6f 72 6d 75 6c     ** The formul
2fcd0 61 20 75 73 65 64 20 69 6e 20 74 68 65 20 65 78  a used in the ex
2fce0 70 72 65 73 73 69 6f 6e 20 61 62 6f 76 65 20 61  pression above a
2fcf0 72 65 20 62 61 73 65 64 20 6f 6e 20 66 61 63 65  re based on face
2fd00 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ts of.        **
2fd10 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
2fd20 2d 66 6f 72 6d 61 74 20 74 68 61 74 20 64 6f 20  -format that do 
2fd30 6e 6f 74 20 63 68 61 6e 67 65 20 6f 76 65 72 20  not change over 
2fd40 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  time..        */
2fd50 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2fd60 65 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  e( pPage->nFree=
2fd70 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2fd80 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20  *2/3+1 );.      
2fd90 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 61    testcase( pLea
2fda0 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
2fdb0 7a 4e 65 78 74 3d 3d 70 42 74 2d 3e 75 73 61 62  zNext==pBt->usab
2fdc0 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a  leSize*2/3+1 );.
2fdd0 20 20 20 20 20 20 20 20 6c 65 61 66 43 75 72 73          leafCurs
2fde0 6f 72 49 6e 76 61 6c 69 64 20 3d 20 31 3b 0a 20  orInvalid = 1;. 
2fdf0 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 0a 0a       }        ..
2fe00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fe10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fe20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2fe30 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2fe40 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2fe50 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  e) );.        pu
2fe60 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2fe70 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  lowCell(pPage, i
2fe80 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  dx), pgnoChild);
2fe90 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  .        VVA_ONL
2fea0 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
2feb0 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20  uffled = 0 );.  
2fec0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2fed0 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  ce(pCur, 0);.   
2fee0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2fef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ff00 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
2ff10 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
2ff20 20 54 68 65 20 6c 65 61 66 2d 6e 6f 64 65 20 69   The leaf-node i
2ff30 73 20 6e 6f 77 20 75 6e 64 65 72 66 75 6c 6c 20  s now underfull 
2ff40 61 6e 64 20 73 6f 20 74 68 65 20 74 72 65 65 20  and so the tree 
2ff50 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
2ff60 20 20 20 20 20 2a 2a 20 72 65 62 61 6c 61 6e 63       ** rebalanc
2ff70 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ed. However, the
2ff80 20 62 61 6c 61 6e 63 65 28 29 20 6f 70 65 72 61   balance() opera
2ff90 74 69 6f 6e 20 6f 6e 20 74 68 65 20 69 6e 74 65  tion on the inte
2ffa0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
2ffb0 6e 6f 64 65 20 61 62 6f 76 65 20 6d 61 79 20 68  node above may h
2ffc0 61 76 65 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ave modified the
2ffd0 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68   structure of th
2ffe0 65 20 42 2d 54 72 65 65 20 61 6e 64 0a 20 20 20  e B-Tree and.   
2fff0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 65 20 63       ** so the c
30000 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
30010 6f 66 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67  of leafCur.apPag
30020 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e  e[] and leafCur.
30030 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20 20 20  aiIdx[].        
30040 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  ** may not be tr
30050 75 73 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  usted..        *
30060 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  *.        ** It 
30070 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
30080 74 6f 20 63 6f 70 79 20 74 68 65 20 61 6e 63 65  to copy the ance
30090 73 74 72 79 20 66 72 6f 6d 20 70 43 75 72 2c 20  stry from pCur, 
300a0 61 73 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  as the same.    
300b0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 28 29      ** balance()
300c0 20 63 61 6c 6c 20 68 61 73 20 69 6e 76 61 6c 69   call has invali
300d0 64 61 74 65 64 20 74 68 65 20 70 43 75 72 2d 3e  dated the pCur->
300e0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49  apPage[] and aiI
300f0 64 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20  dx[].        ** 
30100 61 72 72 61 79 73 2e 20 0a 20 20 20 20 20 20 20  arrays. .       
30110 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
30120 68 65 20 63 61 6c 6c 20 74 6f 20 73 61 76 65 43  he call to saveC
30130 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
30140 62 65 6c 6f 77 20 69 6e 74 65 72 6e 61 6c 6c 79  below internally
30150 20 73 61 76 65 73 20 74 68 65 20 0a 20 20 20 20   saves the .    
30160 20 20 20 20 2a 2a 20 6b 65 79 20 74 68 61 74 20      ** key that 
30170 6c 65 61 66 43 75 72 20 69 73 20 63 75 72 72 65  leafCur is curre
30180 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
30190 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 65  . Currently, the
301a0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72  re.        ** ar
301b0 65 20 74 77 6f 20 63 6f 70 69 65 73 20 6f 66 20  e two copies of 
301c0 74 68 61 74 20 6b 65 79 20 69 6e 20 74 68 65 20  that key in the 
301d0 74 72 65 65 20 2d 20 6f 6e 65 20 68 65 72 65 20  tree - one here 
301e0 6f 6e 20 74 68 65 20 6c 65 61 66 0a 20 20 20 20  on the leaf.    
301f0 20 20 20 20 2a 2a 20 70 61 67 65 20 61 6e 64 20      ** page and 
30200 6f 6e 65 20 6f 6e 20 73 6f 6d 65 20 69 6e 74 65  one on some inte
30210 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 74 68 65  rnal node in the
30220 20 74 72 65 65 2e 20 54 68 65 20 63 6f 70 79 20   tree. The copy 
30230 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
30240 65 20 6c 65 61 66 20 6e 6f 64 65 20 69 73 20 61  e leaf node is a
30250 6c 77 61 79 73 20 74 68 65 20 6e 65 78 74 20 6b  lways the next k
30260 65 79 20 69 6e 20 74 72 65 65 2d 6f 72 64 65 72  ey in tree-order
30270 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
30280 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 6e 20 74      ** copy on t
30290 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
302a0 2e 20 53 6f 2c 20 74 68 65 20 63 61 6c 6c 20 74  . So, the call t
302b0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
302c0 78 74 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  xt().        ** 
302d0 63 61 6c 6c 73 20 72 65 73 74 6f 72 65 43 75 72  calls restoreCur
302e0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 74 6f  sorPosition() to
302f0 20 70 6f 69 6e 74 20 74 68 65 20 63 75 72 73 6f   point the curso
30300 72 20 74 6f 20 74 68 65 20 63 6f 70 79 0a 20 20  r to the copy.  
30310 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
30320 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  on the internal 
30330 6e 6f 64 65 2c 20 74 68 65 6e 20 61 64 76 61 6e  node, then advan
30340 63 65 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ces to the next 
30350 65 6e 74 72 79 2c 0a 20 20 20 20 20 20 20 20 2a  entry,.        *
30360 2a 20 77 68 69 63 68 20 68 61 70 70 65 6e 73 20  * which happens 
30370 74 6f 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  to be the copy o
30380 66 20 74 68 65 20 6b 65 79 20 6f 6e 20 74 68 65  f the key on the
30390 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a   internal node..
303a0 20 20 20 20 20 20 20 20 2a 2a 20 4e 65 74 20 65          ** Net e
303b0 66 66 65 63 74 3a 20 6c 65 61 66 43 75 72 20 69  ffect: leafCur i
303c0 73 20 70 6f 69 6e 74 69 6e 67 20 62 61 63 6b 20  s pointing back 
303d0 74 6f 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  to the duplicate
303e0 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   cell.        **
303f0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
30400 65 20 72 65 6d 6f 76 65 64 2c 20 61 6e 64 20 74  e removed, and t
30410 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67  he leafCur.apPag
30420 65 5b 5d 20 61 6e 64 0a 20 20 20 20 20 20 20 20  e[] and.        
30430 2a 2a 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  ** leafCur.aiIdx
30440 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20 63 6f  [] arrays are co
30450 72 72 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  rrect..        *
30460 2f 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e  /.        VVA_ON
30470 4c 59 28 20 50 67 6e 6f 20 6c 65 61 66 50 67 6e  LY( Pgno leafPgn
30480 6f 20 3d 20 70 4c 65 61 66 50 61 67 65 2d 3e 70  o = pLeafPage->p
30490 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 72  gno );.        r
304a0 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
304b0 73 69 74 69 6f 6e 28 26 6c 65 61 66 43 75 72 29  sition(&leafCur)
304c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
304d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
304e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
304f0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26  lite3BtreeNext(&
30500 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65  leafCur, &notUse
30510 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
30520 20 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20        pLeafPage 
30530 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  = leafCur.apPage
30540 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b  [leafCur.iPage];
30550 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30560 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f   pLeafPage->pgno
30570 3d 3d 6c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20  ==leafPgno );.  
30580 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
30590 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66  afCur.aiIdx[leaf
305a0 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b  Cur.iPage]==0 );
305b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
305c0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
305d0 63 0a 20 20 20 20 20 20 20 26 26 20 53 51 4c 49  c.       && SQLI
305e0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
305f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30600 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67  LeafPage->pDbPag
30610 65 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  e)) .      ){.  
30620 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
30630 4c 65 61 66 50 61 67 65 2c 20 30 2c 20 73 7a 4e  LeafPage, 0, szN
30640 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 56  ext);.        VV
30650 41 5f 4f 4e 4c 59 28 20 6c 65 61 66 43 75 72 2e  A_ONLY( leafCur.
30660 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
30670 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
30680 3d 20 62 61 6c 61 6e 63 65 28 26 6c 65 61 66 43  = balance(&leafC
30690 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
306a0 61 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 73  assert( leafCurs
306b0 6f 72 49 6e 76 61 6c 69 64 20 7c 7c 20 21 6c 65  orInvalid || !le
306c0 61 66 43 75 72 2e 70 61 67 65 73 53 68 75 66 66  afCur.pagesShuff
306d0 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  led.            
306e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306f0 20 20 20 20 20 20 20 7c 7c 20 21 70 43 75 72 2d         || !pCur-
30700 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 29  >pagesShuffled )
30710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30720 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
30730 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  ReleaseTempCurso
30740 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d  r(&leafCur);.  }
30750 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28  else{.    TRACE(
30760 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
30770 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c  %d delete from l
30780 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
30790 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
307a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
307b0 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65  .    rc = dropCe
307c0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63  ll(pPage, idx, c
307d0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
307e0 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 69  , pCell));.    i
307f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30800 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
30810 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b  alance(pCur, 0);
30820 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
30830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30840 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
30850 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCur);.  }.  re
30860 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30870 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42  * Create a new B
30880 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69  Tree table.  Wri
30890 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65  te into *piTable
308a0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
308b0 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ber for the root
308c0 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
308d0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
308e0 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69  e type of type i
308f0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
30900 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
30910 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a  ter.  Only the.*
30920 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75  * following valu
30930 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  es of flags are 
30940 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
30950 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  .  Other values 
30960 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67  for.** flags mig
30970 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a  ht not work:.**.
30980 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54  **     BTREE_INT
30990 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41  KEY|BTREE_LEAFDA
309a0 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20  TA     Used for 
309b0 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20  SQL tables with 
309c0 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20  rowid keys.**   
309d0 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41    BTREE_ZERODATA
309e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309f0 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69    Used for SQL i
30a00 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63  ndices.*/.static
30a10 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65   int btreeCreate
30a20 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
30a30 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
30a40 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68  t flags){.  BtSh
30a50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
30a60 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
30a70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Root;.  Pgno pgn
30a80 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b  oRoot;.  int rc;
30a90 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
30aa0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
30ab0 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
30ac0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
30ad0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
30ae0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
30af0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
30b00 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
30b10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30b20 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
30b30 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
30b40 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
30b50 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 1, 0);.  if( r
30b60 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
30b70 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  rc;.  }.#else.  
30b80 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
30b90 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
30ba0 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
30bb0 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
30bc0 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
30bd0 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
30be0 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
30bf0 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
30c00 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
30c10 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
30c20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74  Creating a new t
30c30 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c  able may probabl
30c40 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
30c50 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   an existing dat
30c60 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20  abase.    ** to 
30c70 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
30c80 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f  e new tables roo
30c90 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20  t page. In case 
30ca0 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a  this page turns.
30cb0 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65      ** out to be
30cc0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
30cd0 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76  e, delete all ov
30ce0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20  erflow page-map 
30cf0 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65  caches.    ** he
30d00 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f  ld by open curso
30d10 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
30d20 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
30d30 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
30d40 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
30d50 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
30d60 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
30d70 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
30d80 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
30d90 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
30da0 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
30db0 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
30dc0 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
30dd0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
30de0 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
30df0 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
30e00 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
30e10 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
30e20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
30e30 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
30e40 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
30e50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30e60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
30e70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
30e80 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20  gnoRoot++;..    
30e90 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d  /* The new root-
30ea0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
30eb0 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70  allocated on a p
30ec0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
30ed0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50   or the.    ** P
30ee0 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65  ENDING_BYTE page
30ef0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
30f00 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  le( pgnoRoot==PT
30f10 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
30f20 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
30f30 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
30f40 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30f50 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
30f60 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
30f70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
30f80 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
30f90 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
30fa0 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
30fb0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
30fc0 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
30fd0 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
30fe0 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
30ff0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
31000 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
31010 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
31020 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
31030 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
31040 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
31050 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
31060 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
31070 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
31080 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
31090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
310a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
310b0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
310c0 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
310d0 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
310e0 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  /* pgnoRoot is t
310f0 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  he page that wil
31100 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
31110 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20  e root-page of. 
31120 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
31130 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20  table (assuming 
31140 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74  an error did not
31150 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20   occur). But we 
31160 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  were.      ** al
31170 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65  located pgnoMove
31180 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69  . If required (i
31190 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f  .e. if it was no
311a0 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  t allocated.    
311b0 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e    ** by extendin
311c0 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65  g the file), the
311d0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74   current page at
311e0 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f   position pgnoMo
311f0 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  ve.      ** is a
31200 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64  lready journaled
31210 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31220 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
31230 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
31240 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
31250 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a  ge(pPageMove);..
31260 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68        /* Move th
31270 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
31280 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20   at pgnoRoot to 
31290 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20  pgnoMove. */.   
312a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
312b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
312c0 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
312d0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
312e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
312f0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
31300 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
31310 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
31320 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
31330 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
31340 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
31350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
31360 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
31370 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
31380 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
31390 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
313a0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
313b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
313c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
313d0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
313e0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
313f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31400 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
31410 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
31420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31430 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
31440 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
31450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31460 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
31470 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
31480 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
31490 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
314a0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
314b0 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
314c0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
314d0 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
314e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
314f0 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
31500 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
31510 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
31520 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
31530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31540 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
31550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
31560 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
31570 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
31580 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
31590 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
315a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
315b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
315c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
315d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
315e0 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
315f0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
31600 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31610 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
31620 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
31630 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
31640 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
31650 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
31660 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
31670 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
31680 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
31690 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
316a0 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
316b0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
316c0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
316d0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
316e0 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
316f0 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
31700 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
31710 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
31720 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
31730 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
31740 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
31750 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
31760 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
31770 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
31780 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
31790 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
317a0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
317b0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
317c0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
317d0 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
317e0 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
317f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31800 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
31810 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
31820 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
31830 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
31840 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
31850 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
31860 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
31870 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
31880 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
31890 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
318a0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
318b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
318c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
318d0 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
318e0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
318f0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
31900 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
31910 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
31920 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
31930 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
31940 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
31950 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , piTable, flags
31960 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
31970 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
31980 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
31990 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
319a0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
319b0 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
319c0 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
319d0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
319e0 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
319f0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
31a00 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
31a10 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
31a20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
31a30 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
31a40 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
31a50 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
31a60 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
31a70 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
31a80 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46  .  int freePageF
31a90 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c  lag,     /* Deal
31aa0 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74  locate page if t
31ab0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rue */.  int *pn
31ac0 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50  Change.){.  MemP
31ad0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
31ae0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
31af0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
31b00 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
31b10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
31b20 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
31b30 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
31b40 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
31b50 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  t(pBt) ){.    re
31b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
31b70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
31b80 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
31b90 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
31ba0 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
31bb0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
31bc0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
31bd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
31be0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
31bf0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
31c00 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
31c10 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
31c20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
31c30 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
31c40 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
31c50 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70  yte(pCell), 1, p
31c60 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
31c70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
31c80 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
31c90 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
31ca0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
31cb0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
31cc0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
31cd0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
31ce0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
31cf0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
31d00 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
31d10 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
31d20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
31d30 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70  >aData[8]), 1, p
31d40 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66  nChange);.    if
31d50 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
31d60 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
31d70 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
31d80 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61  nChange ){.    a
31d90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
31da0 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43  tKey );.    *pnC
31db0 68 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e  hange += pPage->
31dc0 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28  nCell;.  }.  if(
31dd0 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b   freePageFlag ){
31de0 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
31df0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c  ge(pPage);.  }el
31e00 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
31e10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31e20 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d  Page->pDbPage))=
31e30 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61  =0 ){.    zeroPa
31e40 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
31e50 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f  >aData[0] | PTF_
31e60 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61  LEAF);.  }..clea
31e70 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
31e80 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
31e90 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
31ea0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
31eb0 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  elete all inform
31ec0 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e  ation from a sin
31ed0 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
31ee0 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62   database.  iTab
31ef0 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67  le is.** the pag
31f00 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
31f10 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
31f20 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  e.  After this r
31f30 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a  outine returns,.
31f40 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
31f50 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73   is empty, but s
31f60 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  till exists..**.
31f70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
31f80 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
31f90 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
31fa0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
31fb0 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f  en.** read curso
31fc0 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
31fd0 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72    Open write cur
31fe0 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74  sors are moved t
31ff0 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66  o the.** root of
32000 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
32010 2a 20 49 66 20 70 6e 43 68 61 6e 67 65 20 69 73  * If pnChange is
32020 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
32030 74 61 62 6c 65 20 69 54 61 62 6c 65 20 6d 75 73  table iTable mus
32040 74 20 62 65 20 61 6e 20 69 6e 74 6b 65 79 20 74  t be an intkey t
32050 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74  able. The.** int
32060 65 67 65 72 20 76 61 6c 75 65 20 70 6f 69 6e 74  eger value point
32070 65 64 20 74 6f 20 62 79 20 70 6e 43 68 61 6e 67  ed to by pnChang
32080 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
32090 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
320a0 66 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20  f.** entries in 
320b0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  the table..*/.in
320c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
320d0 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a  earTable(Btree *
320e0 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
320f0 6e 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20  nt *pnChange){. 
32100 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
32110 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
32120 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
32130 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
32140 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
32150 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
32160 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
32170 29 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 63  );.  if( (rc = c
32180 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
32190 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21   iTable, 0, 1))!
321a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
321b0 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
321c0 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  do */.  }else if
321d0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
321e0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
321f0 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30  s(pBt, iTable, 0
32200 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  )) ){.    /* not
32210 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
32220 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
32230 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
32240 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
32250 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65  ble, 0, pnChange
32260 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
32270 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
32280 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32290 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
322a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
322b0 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
322c0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
322d0 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
322e0 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
322f0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
32300 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
32310 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
32320 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
32330 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
32340 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
32350 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
32360 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
32370 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
32380 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
32390 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
323a0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
323b0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
323c0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
323d0 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
323e0 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
323f0 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
32400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
32410 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
32420 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
32430 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32440 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   is moved into t
32450 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  he slot formerly
32460 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20   occupied by.** 
32470 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20  iTable and that 
32480 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72  last slot former
32490 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74  ly occupied by t
324a0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
324b0 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  e.** is added to
324c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
324d0 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e  stead of iTable.
324e0 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61    In this say, a
324f0 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
32500 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65   are kept at the
32510 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
32520 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
32530 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63   which.** is nec
32540 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56  essary for AUTOV
32550 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69  ACUUM to work ri
32560 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69  ght.  *piMoved i
32570 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
32580 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
32590 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65  t used to be the
325a0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
325b0 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  in the file befo
325c0 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20  re.** the move. 
325d0 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73   If no page gets
325e0 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64   moved, *piMoved
325f0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
32600 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   The last root p
32610 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20  age is recorded 
32620 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74  in meta[3] and t
32630 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d  he value of.** m
32640 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65  eta[3] is update
32650 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
32660 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
32670 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c  nt btreeDropTabl
32680 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  e(Btree *p, Pgno
32690 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
326a0 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
326b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
326c0 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
326d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
326e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
326f0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
32700 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
32710 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
32720 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a  TRANS_WRITE );..
32730 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
32740 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
32750 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
32760 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
32770 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
32780 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
32790 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
327a0 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
327b0 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
327c0 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
327d0 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
327e0 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
327f0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
32800 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
32810 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
32820 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
32830 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
32840 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
32850 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
32860 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
32870 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
32880 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  D;.  }..  rc = s
32890 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
328a0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
328b0 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29  able, &pPage, 0)
328c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
328d0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
328e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
328f0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c  Table(p, iTable,
32900 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
32910 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
32920 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
32930 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  urn rc;.  }..  *
32940 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  piMoved = 0;..  
32950 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a  if( iTable>1 ){.
32960 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
32970 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32980 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
32990 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  pPage);.    rele
329a0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
329b0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42  #else.    if( pB
329c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
329d0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52  .      Pgno maxR
329e0 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72  ootPgno;.      r
329f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
32a00 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d  GetMeta(p, 4, &m
32a10 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
32a20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32a40 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
32a50 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
32a60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
32a70 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65        if( iTable
32a80 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b  ==maxRootPgno ){
32a90 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
32aa0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
32ab0 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61  ropped is the ta
32ac0 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ble with the lar
32ad0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
32ae0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
32af0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
32b00 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70  , put the root p
32b10 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20  age on the free 
32b20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
32b30 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
32b40 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
32b50 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32b60 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
32b70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32b90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
32bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
32bc0 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
32bd0 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74  dropped does not
32be0 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73   have the larges
32bf0 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
32c00 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
32c10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53   the database. S
32c20 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  o move the page 
32c30 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74  that does into t
32c40 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  he .        ** g
32c50 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
32c60 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65  eleted root-page
32c70 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32c80 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d       MemPage *pM
32c90 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ove;.        rel
32ca0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
32cb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32cc0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
32cd0 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
32ce0 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
32cf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32d10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
32d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32d30 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
32d40 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65  ePage(pBt, pMove
32d50 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
32d60 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29  E, 0, iTable, 0)
32d70 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
32d80 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
32d90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32db0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
32dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32dd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
32de0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
32df0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
32e00 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
32e10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32e20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32e30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
32e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
32e50 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65  = freePage(pMove
32e60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
32e70 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
32e80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32e90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32ea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
32eb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32ec0 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61     *piMoved = ma
32ed0 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
32ee0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
32ef0 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f   the new 'max-ro
32f00 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69  ot-page' value i
32f10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
32f20 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20  eader. This.    
32f30 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20    ** is the old 
32f40 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20  value less one, 
32f50 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66  less one more if
32f60 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f   that happens to
32f70 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72  .      ** be a r
32f80 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c  oot-page number,
32f90 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20   less one again 
32fa0 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  if that is the. 
32fb0 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f       ** PENDING_
32fc0 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20  BYTE_PAGE..     
32fd0 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f   */.      maxRoo
32fe0 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69  tPgno--;.      i
32ff0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
33000 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33010 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
33020 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
33030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33040 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
33050 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
33060 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  t, maxRootPgno) 
33070 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
33080 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
33090 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
330a0 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
330b0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
330c0 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
330d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
330e0 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
330f0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
33100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
33110 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
33120 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
33130 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
33140 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
33150 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  lse{.    /* If s
33160 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
33170 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20  able was called 
33180 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
33190 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
331a0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
331b0 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c  _LEAF );.    rel
331c0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
331d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
331e0 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ;  .}.int sqlite
331f0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
33200 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
33210 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
33220 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
33230 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
33240 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
33250 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
33260 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62  c = btreeDropTab
33270 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69  le(p, iTable, pi
33280 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  Moved);.  sqlite
33290 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
332a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
332b0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
332c0 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
332d0 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61   out of a databa
332e0 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30  se file.  Meta[0
332f0 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62  ].** is the numb
33300 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  er of free pages
33310 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
33320 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
33330 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20  a[1].** through 
33340 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61  meta[15] are ava
33350 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62  ilable for use b
33360 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e  y higher layers.
33370 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
33380 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f  read-only, the o
33390 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77  thers are read/w
333a0 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  rite..** .** The
333b0 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75   schema layer nu
333c0 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65  mbers meta value
333d0 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20  s differently.  
333e0 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a  At the schema.**
333f0 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20   layer (and the 
33400 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65  SetCookie and Re
33410 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73  adCookie opcodes
33420 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  ) the number of.
33430 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73  ** free pages is
33440 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53   not visible.  S
33450 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74  o Cookie[0] is t
33460 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b  he same as Meta[
33470 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  1]..*/.int sqlit
33480 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42  e3BtreeGetMeta(B
33490 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  tree *p, int idx
334a0 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20  , u32 *pMeta){. 
334b0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
334c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
334d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
334e0 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64  *pP1;.  BtShared
334f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
33500 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
33510 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
33520 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
33530 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61  * Reading a meta
33540 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75  -data value requ
33550 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
33560 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20   on page 1 (and 
33570 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73  hence.  ** the s
33580 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
33590 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73  le. We grab this
335a0 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73   lock regardless
335b0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20   of whether or. 
335c0 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49   ** not the SQLI
335d0 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
335e0 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28  ed flag is set (
335f0 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
33600 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20   at page.  ** 1 
33610 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20  is treated as a 
33620 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20  special case by 
33630 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
33640 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29   and lockTable()
33650 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71  )..  */.  rc = q
33660 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
33670 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
33680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33690 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
336a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
336b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
336c0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
336d0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
336e0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   );.  if( pBt->p
336f0 50 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Page1 ){.    /* 
33700 54 68 65 20 62 2d 74 72 65 65 20 69 73 20 61 6c  The b-tree is al
33710 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 20  ready holding a 
33720 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
33730 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
33740 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ase.    ** file.
33750 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
33760 65 20 72 65 71 75 69 72 65 64 20 6d 65 74 61 2d  e required meta-
33770 64 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20 62  data value can b
33780 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 0a  e read directly.
33790 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
337a0 70 61 67 65 20 64 61 74 61 20 6f 66 20 74 68 69  page data of thi
337b0 73 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  s reference. Thi
337c0 73 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  s is slightly fa
337d0 73 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  ster than.    **
337e0 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e 65   requesting a ne
337f0 77 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d  w reference from
33800 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
33810 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 31  ..    */.    pP1
33820 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
33830 72 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  r *)pBt->pPage1-
33840 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  >aData;.  }else{
33850 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72  .    /* The b-tr
33860 65 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ee does not have
33870 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
33880 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
33890 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
338a0 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20 66   ** Obtain one f
338b0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
338c0 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  yer..    */.    
338d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
338e0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
338f0 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , 1, &pDbPage);.
33900 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
33910 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
33920 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
33930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
33940 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69  .    pP1 = (unsi
33950 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
33960 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
33970 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
33980 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74  *pMeta = get4byt
33990 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
339a0 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  4]);..  /* If th
339b0 65 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74 20  e b-tree is not 
339c0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
339d0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20 74  nce to page 1, t
339e0 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20 2a  hen one was .  *
339f0 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
33a00 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
33a10 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62 6c   in the above bl
33a20 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74 20  ock. Release it 
33a30 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
33a40 21 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a  !pBt->pPage1 ){.
33a50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33a60 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
33a70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74    }..  /* If aut
33a80 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73  ovacuumed is dis
33a90 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
33aa0 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74  ild but we are t
33ab0 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61  rying to .  ** a
33ac0 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63  ccess an autovac
33ad0 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20  uumed database, 
33ae0 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61  then make the da
33af0 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e  tabase readonly.
33b00 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   .  */.#ifdef SQ
33b10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
33b20 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d  CUUM.  if( idx==
33b30 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20  4 && *pMeta>0 ) 
33b40 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
33b50 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  1;.#endif..  /* 
33b60 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f  Grab the read-lo
33b70 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ck on page 1. */
33b80 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c  .  rc = lockTabl
33b90 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  e(p, 1, READ_LOC
33ba0 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K);.  sqlite3Btr
33bb0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
33bc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33bd0 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66  * Write meta-inf
33be0 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e  ormation back in
33bf0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
33c00 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20    Meta[0] is.** 
33c10 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61  read-only and ma
33c20 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  y not be written
33c30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33c40 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
33c50 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
33c60 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20  x, u32 iMeta){. 
33c70 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33c80 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
33c90 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
33ca0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
33cb0 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78  t( idx>=1 && idx
33cc0 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  <=15 );.  sqlite
33cd0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
33ce0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
33cf0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
33d00 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
33d10 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
33d20 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  ( pBt->pPage1!=0
33d30 20 29 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d   );.  pP1 = pBt-
33d40 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a  >pPage1->aData;.
33d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33d60 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
33d70 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
33d80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33d90 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 75 74 34 62  _OK ){.    put4b
33da0 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
33db0 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69  x*4], iMeta);.#i
33dc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33dd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33de0 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20   if( idx==7 ){. 
33df0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
33e00 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20  ->autoVacuum || 
33e10 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  iMeta==0 );.    
33e20 20 20 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d    assert( iMeta=
33e30 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29  =0 || iMeta==1 )
33e40 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
33e50 72 56 61 63 75 75 6d 20 3d 20 28 75 38 29 69 4d  rVacuum = (u8)iM
33e60 65 74 61 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eta;.    }.#endi
33e70 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  f.  }.  sqlite3B
33e80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
33e90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33ea0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
33eb0 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20  lag byte at the 
33ec0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
33ed0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63   page that the c
33ee0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
33ef0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
33f00 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
33f10 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75  3BtreeFlags(BtCu
33f20 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
33f30 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f  * TODO: What abo
33f40 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  ut CURSOR_REQUIR
33f50 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f  ESEEK state? Pro
33f60 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61  bably need to ca
33f70 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43  ll.  ** restoreC
33f80 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
33f90 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d  here..  */.  Mem
33fa0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72  Page *pPage;.  r
33fb0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
33fc0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50  tion(pCur);.  pP
33fd0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
33fe0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
33ff0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
34000 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
34010 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34020 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
34030 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d  ert( pPage->pBt=
34040 3d 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20  =pCur->pBt );.  
34050 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 44  return pPage->aD
34060 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
34070 66 73 65 74 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  fset];.}.../*.**
34080 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
34090 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
340a0 68 20 61 20 42 54 72 65 65 2e 20 20 54 68 69 73  h a BTree.  This
340b0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
340c0 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
340d0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
340e0 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71  ly..*/.Pager *sq
340f0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
34100 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
34110 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  urn p->pBt->pPag
34120 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  er;.}..#ifndef S
34130 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
34140 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
34150 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73 61 67   Append a messag
34160 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  e to the error m
34170 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a  essage string..*
34180 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
34190 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a 20 20  eckAppendMsg(.  
341a0 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
341b0 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73  eck,.  char *zMs
341c0 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g1,.  const char
341d0 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e   *zFormat,.  ...
341e0 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
341f0 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b 2d  ;.  if( !pCheck-
34200 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e 3b  >mxErr ) return;
34210 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  .  pCheck->mxErr
34220 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e 45  --;.  pCheck->nE
34230 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72 74  rr++;.  va_start
34240 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
34250 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65 72 72   if( pCheck->err
34260 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20 20 20  Msg.nChar ){.   
34270 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
34280 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e  Append(&pCheck->
34290 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20 31 29  errMsg, "\n", 1)
342a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 73 67  ;.  }.  if( zMsg
342b0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
342c0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
342d0 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20  pCheck->errMsg, 
342e0 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20 7d 0a  zMsg1, -1);.  }.
342f0 20 20 73 71 6c 69 74 65 33 56 58 50 72 69 6e 74    sqlite3VXPrint
34300 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73  f(&pCheck->errMs
34310 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  g, 1, zFormat, a
34320 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
34330 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  ;.  if( pCheck->
34340 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46 61 69  errMsg.mallocFai
34350 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68 65 63  led ){.    pChec
34360 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  k->mallocFailed 
34370 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 1;.  }.}.#endi
34380 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
34390 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
343a0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
343b0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
343c0 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41  TY_CHECK./*.** A
343d0 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66 65  dd 1 to the refe
343e0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
343f0 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66 20  page iPage.  If 
34400 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
34410 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  nd.** reference 
34420 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64 64  to the page, add
34430 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
34440 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72  e to pCheck->zEr
34450 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  rMsg..** Return 
34460 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20 32  1 if there are 2
34470 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65   ore more refere
34480 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
34490 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20   and 0 if.** if 
344a0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
344b0 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  t reference to t
344c0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  he page..**.** A
344d0 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74  lso check that t
344e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
344f0 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a  s in bounds..*/.
34500 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
34510 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20  Ref(IntegrityCk 
34520 2a 70 43 68 65 63 6b 2c 20 50 67 6e 6f 20 69 50  *pCheck, Pgno iP
34530 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74  age, char *zCont
34540 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67  ext){.  if( iPag
34550 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
34560 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68  .  if( iPage>pCh
34570 65 63 6b 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20  eck->nPage ){.  
34580 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34590 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
345a0 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65  t, "invalid page
345b0 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61   number %d", iPa
345c0 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
345d0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68  1;.  }.  if( pCh
345e0 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
345f0 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63  ]==1 ){.    chec
34600 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
34610 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e  k, zContext, "2n
34620 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  d reference to p
34630 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
34640 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
34650 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43   }.  return  (pC
34660 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
34670 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e  e]++)>1;.}..#ifn
34680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34690 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
346a0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
346b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
346c0 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67  nter-map for pag
346d0 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f  e iChild maps to
346e0 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e   .** page iParen
346f0 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20  t, pointer type 
34700 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c  ptrType. If not,
34710 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72   append an error
34720 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70   message.** to p
34730 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Check..*/.static
34740 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61   void checkPtrma
34750 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  p(.  IntegrityCk
34760 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49   *pCheck,   /* I
34770 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 63  ntegrity check c
34780 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f  ontext */.  Pgno
34790 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20   iChild,        
347a0 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65     /* Child page
347b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20   number */.  u8 
347c0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
347d0 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
347e0 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65  pointer map type
347f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65   */.  Pgno iPare
34800 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt,          /* 
34810 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
34820 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65   map parent page
34830 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
34840 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20  r *zContext     
34850 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64      /* Context d
34860 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64  escription (used
34870 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20   for error msg) 
34880 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
34890 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70 65    u8 ePtrmapType
348a0 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  ;.  Pgno iPtrmap
348b0 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20  Parent;..  rc = 
348c0 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b  ptrmapGet(pCheck
348d0 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26  ->pBt, iChild, &
348e0 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50  ePtrmapType, &iP
348f0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
34900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34910 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
34920 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
34930 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61  pCheck->mallocFa
34940 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 63 68  iled = 1;.    ch
34950 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
34960 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
34970 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70  Failed to read p
34980 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69  trmap key=%d", i
34990 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
349a0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65  rn;.  }..  if( e
349b0 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70  PtrmapType!=eTyp
349c0 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65  e || iPtrmapPare
349d0 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20  nt!=iParent ){. 
349e0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
349f0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
34a00 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20  xt, .      "Bad 
34a10 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65  ptr map entry ke
34a20 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25  y=%d expected=(%
34a30 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64  d,%d) got=(%d,%d
34a40 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c  )", .      iChil
34a50 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e  d, eType, iParen
34a60 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20  t, ePtrmapType, 
34a70 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
34a80 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
34a90 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e  .** Check the in
34aa0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66  tegrity of the f
34ab0 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e  reelist or of an
34ac0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
34ad0 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74  ist..** Verify t
34ae0 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
34af0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c  f pages on the l
34b00 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61  ist is N..*/.sta
34b10 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69  tic void checkLi
34b20 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  st(.  IntegrityC
34b30 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49  k *pCheck,  /* I
34b40 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e  ntegrity checkin
34b50 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
34b60 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20  nt isFreeList,  
34b70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
34b80 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61   a freelist.  Fa
34b90 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77  lse for overflow
34ba0 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20   page list */.  
34bb0 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
34bc0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
34bd0 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70  mber for first p
34be0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
34bf0 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
34c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
34c10 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
34c20 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
34c30 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  st */.  char *zC
34c40 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a  ontext        /*
34c50 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72   Context for err
34c60 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29  or messages */.)
34c70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
34c80 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20   expected = N;. 
34c90 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50   int iFirst = iP
34ca0 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d  age;.  while( N-
34cb0 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d  - > 0 && pCheck-
34cc0 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62  >mxErr ){.    Db
34cd0 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b  Page *pOvflPage;
34ce0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
34cf0 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20  ar *pOvflData;. 
34d00 20 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29     if( iPage<1 )
34d10 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
34d20 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
34d30 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20  Context,.       
34d40 20 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65    "%d of %d page
34d50 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f  s missing from o
34d60 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61  verflow list sta
34d70 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20  rting at %d",.  
34d80 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70          N+1, exp
34d90 65 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a  ected, iFirst);.
34da0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34db0 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b   }.    if( check
34dc0 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
34dd0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62  e, zContext) ) b
34de0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71  reak;.    if( sq
34df0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43  lite3PagerGet(pC
34e00 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50  heck->pPager, (P
34e10 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66  gno)iPage, &pOvf
34e20 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  lPage) ){.      
34e30 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
34e40 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
34e50 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20   "failed to get 
34e60 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
34e70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
34e80 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61     }.    pOvflDa
34e90 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
34ea0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
34eb0 65 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50  erGetData(pOvflP
34ec0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73  age);.    if( is
34ed0 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20  FreeList ){.    
34ee0 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79    int n = get4by
34ef0 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d  te(&pOvflData[4]
34f00 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34f10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34f20 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65  M.      if( pChe
34f30 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
34f40 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
34f50 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
34f60 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  k, iPage, PTRMAP
34f70 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
34f80 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
34f90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
34fa0 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d  ( n>pCheck->pBt-
34fb0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20  >usableSize/4-2 
34fc0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
34fd0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
34fe0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
34ff0 20 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74         "freelist
35000 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20   leaf count too 
35010 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c  big on page %d",
35020 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
35030 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73   N--;.      }els
35040 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  e{.        for(i
35050 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
35060 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46           Pgno iF
35070 72 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79  reePage = get4by
35080 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b  te(&pOvflData[8+
35090 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  i*4]);.#ifndef S
350a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
350b0 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20  ACUUM.          
350c0 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
350d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
350e0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
350f0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69  Ptrmap(pCheck, i
35100 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50  FreePage, PTRMAP
35110 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43  _FREEPAGE, 0, zC
35120 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
35130 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
35140 20 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70        checkRef(p
35150 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
35160 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
35170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e       }.        N
35180 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   -= n;.      }. 
35190 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
351a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
351b0 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  UUM.    else{.  
351c0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64      /* If this d
351d0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
351e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64   auto-vacuum and
351f0 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68   iPage is not th
35200 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e last.      ** 
35210 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65  page in this ove
35220 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63  rflow list, chec
35230 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74  k that the point
35240 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
35250 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  .      ** the fo
35260 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74  llowing page mat
35270 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20  ches iPage..    
35280 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
35290 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
352a0 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b  Vacuum && N>0 ){
352b0 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74  .        i = get
352c0 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
352d0 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  ;.        checkP
352e0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c  trmap(pCheck, i,
352f0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
35300 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  2, iPage, zConte
35310 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xt);.      }.   
35320 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50   }.#endif.    iP
35330 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70  age = get4byte(p
35340 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73  OvflData);.    s
35350 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35360 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d  (pOvflPage);.  }
35370 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
35380 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
35390 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
353a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
353b0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
353c0 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75  ./*.** Do variou
353d0 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20  s sanity checks 
353e0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  on a single page
353f0 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74   of a tree.  Ret
35400 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  urn.** the tree 
35410 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67  depth.  Root pag
35420 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61  es return 0.  Pa
35430 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61  rents of root pa
35440 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c  ges.** return 1,
35450 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   and so forth..*
35460 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63  * .** These chec
35470 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a  ks are done:.**.
35480 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65  **      1.  Make
35490 20 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73   sure that cells
354a0 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20   and freeblocks 
354b0 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a  do not overlap.*
354c0 2a 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63  *          but c
354d0 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65  ombine to comple
354e0 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70  tely cover the p
354f0 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20  age..**  NO  2. 
35500 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20   Make sure cell 
35510 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65  keys are in orde
35520 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d  r..**  NO  3.  M
35530 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20  ake sure no key 
35540 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
35550 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42  equal to zLowerB
35560 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e  ound..**  NO  4.
35570 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b    Make sure no k
35580 65 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ey is greater th
35590 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
355a0 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  UpperBound..**  
355b0 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68      5.  Check th
355c0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f  e integrity of o
355d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
355e0 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72  *      6.  Recur
355f0 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63  sively call chec
35600 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c  kTreePage on all
35610 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20   children..**   
35620 20 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68     7.  Verify th
35630 61 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  at the depth of 
35640 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20  all children is 
35650 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20  the same..**    
35660 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    8.  Make sure 
35670 74 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20  this page is at 
35680 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f  least 33% full o
35690 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20  r else it is.** 
356a0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f           the roo
356b0 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a  t of the tree..*
356c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
356d0 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e  ckTreePage(.  In
356e0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
356f0 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66  k,  /* Context f
35700 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68  or the sanity ch
35710 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  eck */.  int iPa
35720 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
35730 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
35740 20 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65   the page to che
35750 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ck */.  char *zP
35760 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a  arentContext  /*
35770 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20   Parent context 
35780 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
35790 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c  *pPage;.  int i,
357a0 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20   rc, depth, d2, 
357b0 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74  pgno, cnt;.  int
357c0 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b   hdr, cellStart;
357d0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
357e0 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68  u8 *data;.  BtSh
357f0 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74  ared *pBt;.  int
35800 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63   usableSize;.  c
35810 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30  har zContext[100
35820 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 20 3d  ];.  char *hit =
35830 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73   0;..  sqlite3_s
35840 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
35850 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
35860 78 74 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c  xt, "Page %d: ",
35870 20 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43   iPage);..  /* C
35880 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
35890 67 65 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20  ge exists.  */. 
358a0 20 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70   pBt = pCheck->p
358b0 42 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  Bt;.  usableSize
358c0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
358d0 7a 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d  ze;.  if( iPage=
358e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
358f0 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43   if( checkRef(pC
35900 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61  heck, iPage, zPa
35910 72 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72  rentContext) ) r
35920 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
35930 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
35940 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50  eGetPage(pBt, (P
35950 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67  gno)iPage, &pPag
35960 65 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20  e, 0))!=0 ){.   
35970 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35980 4e 4f 4d 45 4d 20 29 20 70 43 68 65 63 6b 2d 3e  NOMEM ) pCheck->
35990 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
359a0 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  ;.    checkAppen
359b0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
359c0 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75  ntext,.       "u
359d0 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65  nable to get the
359e0 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64   page. error cod
359f0 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e=%d", rc);.    
35a00 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
35a10 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
35a20 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
35a30 50 61 67 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  Page))!=0 ){.   
35a40 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
35a50 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 20 20  ITE_CORRUPT );  
35a60 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 70 6f 73 73  /* The only poss
35a70 69 62 6c 65 20 65 72 72 6f 72 20 66 72 6f 6d 20  ible error from 
35a80 49 6e 69 74 50 61 67 65 20 2a 2f 0a 20 20 20 20  InitPage */.    
35a90 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
35aa0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
35ab0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
35ac0 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72       "sqlite3Btr
35ad0 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74  eeInitPage() ret
35ae0 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20  urns error code 
35af0 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
35b00 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
35b10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
35b20 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
35b30 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  out all the cell
35b40 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20  s..  */.  depth 
35b50 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
35b60 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  i<pPage->nCell &
35b70 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b  & pCheck->mxErr;
35b80 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
35b90 43 65 6c 6c 3b 0a 20 20 20 20 75 33 32 20 73 7a  Cell;.    u32 sz
35ba0 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ;.    CellInfo i
35bb0 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  nfo;..    /* Che
35bc0 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66  ck payload overf
35bd0 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f  low pages.    */
35be0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
35bf0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
35c00 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
35c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
35c20 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20  On tree page %d 
35c30 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67  cell %d: ", iPag
35c40 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c  e, i);.    pCell
35c50 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
35c60 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e,i);.    sqlite
35c70 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
35c80 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
35c90 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20   &info);.    sz 
35ca0 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  = info.nData;.  
35cb0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e    if( !pPage->in
35cc0 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 28 69 6e  tKey ) sz += (in
35cd0 74 29 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  t)info.nKey;.   
35ce0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66   assert( sz==inf
35cf0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
35d00 20 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c    if( sz>info.nL
35d10 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  ocal ){.      in
35d20 74 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20  t nPage = (sz - 
35d30 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73  info.nLocal + us
35d40 61 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75  ableSize - 5)/(u
35d50 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
35d60 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
35d70 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
35d80 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
35d90 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20  flow]);.#ifndef 
35da0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35db0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
35dc0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
35dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
35de0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
35df0 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50  pgnoOvfl, PTRMAP
35e00 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67  _OVERFLOW1, iPag
35e10 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
35e20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
35e30 20 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68     checkList(pCh
35e40 65 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c  eck, 0, pgnoOvfl
35e50 2c 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , nPage, zContex
35e60 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  t);.    }..    /
35e70 2a 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f  * Check sanity o
35e80 66 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67  f left child pag
35e90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
35ea0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
35eb0 7b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  {.      pgno = g
35ec0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
35ed0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35ee0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35ef0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
35f00 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
35f10 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
35f20 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
35f30 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
35f40 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
35f50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
35f60 20 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65     d2 = checkTre
35f70 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67  ePage(pCheck, pg
35f80 6e 6f 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  no, zContext);. 
35f90 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
35fa0 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20  d2!=depth ){.   
35fb0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
35fc0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
35fd0 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67  text, "Child pag
35fe0 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22  e depth differs"
35ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36000 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20   depth = d2;.   
36010 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50   }.  }.  if( !pP
36020 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
36030 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
36040 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
36050 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
36060 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  8]);.    sqlite3
36070 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
36080 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
36090 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
360a0 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
360b0 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74  page %d at right
360c0 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65   child: ", iPage
360d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
360e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
360f0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
36100 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
36110 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
36120 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
36130 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
36140 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
36150 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
36160 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
36170 6f 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  o, zContext);.  
36180 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
36190 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
361a0 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
361b0 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
361c0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
361d0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
361e0 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
361f0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
36200 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
36210 29 3b 0a 20 20 69 66 28 20 68 69 74 3d 3d 30 20  );.  if( hit==0 
36220 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d  ){.    pCheck->m
36230 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
36240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 31  .  }else{.    u1
36250 36 20 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20  6 contentOffset 
36260 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
36270 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 69 66  [hdr+5]);.    if
36280 20 28 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 20   (contentOffset 
36290 3e 20 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a  > usableSize) {.
362a0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
362b0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
362c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
362d0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
362e0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 68 65  n detected in he
362f0 61 64 65 72 20 6f 6e 20 70 61 67 65 20 25 64 22  ader on page %d"
36300 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
36310 20 67 6f 74 6f 20 63 68 65 63 6b 5f 70 61 67 65   goto check_page
36320 5f 61 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _abort;.    }.  
36330 20 20 6d 65 6d 73 65 74 28 68 69 74 2b 63 6f 6e    memset(hit+con
36340 74 65 6e 74 4f 66 66 73 65 74 2c 20 30 2c 20 75  tentOffset, 0, u
36350 73 61 62 6c 65 53 69 7a 65 2d 63 6f 6e 74 65 6e  sableSize-conten
36360 74 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 6d 65  tOffset);.    me
36370 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 63 6f 6e  mset(hit, 1, con
36380 74 65 6e 74 4f 66 66 73 65 74 29 3b 0a 20 20 20  tentOffset);.   
36390 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
363a0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
363b0 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d  .    cellStart =
363c0 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
363d0 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66  age->leaf;.    f
363e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
363f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
36400 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
36410 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69  data[cellStart+i
36420 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20  *2]);.      u16 
36430 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
36440 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
36450 69 66 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69  if( pc<=usableSi
36460 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 69  ze ){.        si
36470 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
36480 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
36490 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
364a0 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31    if( (pc+size-1
364b0 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
364c0 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   pc<0 ){.       
364d0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
364e0 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
364f0 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
36500 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
36510 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
36520 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
36530 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
36540 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69       for(j=pc+si
36550 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d  ze-1; j>=pc; j--
36560 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
36570 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
36580 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62  r(cnt=0, i=get2b
36590 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
365a0 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62  ); i>0 && i<usab
365b0 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30  leSize && cnt<10
365c0 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20  000; .          
365d0 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69   cnt++){.      i
365e0 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
365f0 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a  te(&data[i+2]);.
36600 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
36610 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31     if( (i+size-1
36620 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
36630 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
36640 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
36650 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20  Check, 0,  .    
36660 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
36670 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
36680 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
36690 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
366a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
366b0 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a       for(j=i+siz
366c0 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20  e-1; j>=i; j--) 
366d0 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
366e0 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32  }.      i = get2
366f0 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a  byte(&data[i]);.
36700 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
36710 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53  cnt=0; i<usableS
36720 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ize; i++){.     
36730 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29   if( hit[i]==0 )
36740 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b  {.        cnt++;
36750 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
36760 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20   hit[i]>1 ){.   
36770 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
36780 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20  Msg(pCheck, 0,. 
36790 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70           "Multip
367a0 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65  le uses for byte
367b0 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c   %d of page %d",
367c0 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20   i, iPage);.    
367d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
367e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
367f0 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37   cnt!=data[hdr+7
36800 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ] ){.      check
36810 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
36820 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
36830 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63  "Fragmented spac
36840 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70  e is %d byte rep
36850 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70  orted as %d on p
36860 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20  age %d",.       
36870 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72     cnt, data[hdr
36880 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  +7], iPage);.   
36890 20 7d 0a 20 20 7d 0a 63 68 65 63 6b 5f 70 61 67   }.  }.check_pag
368a0 65 5f 61 62 6f 72 74 3a 0a 20 20 69 66 20 28 68  e_abort:.  if (h
368b0 69 74 29 20 73 71 6c 69 74 65 33 50 61 67 65 46  it) sqlite3PageF
368c0 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c  ree(hit);..  rel
368d0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
368e0 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b  .  return depth+
368f0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
36900 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
36910 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
36920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36930 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
36940 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
36950 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d  utine does a com
36960 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74  plete check of t
36970 68 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66  he given BTree f
36980 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73  ile.  aRoot[] is
36990 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
369a0 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65  pages numbers we
369b0 72 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d  re each page num
369c0 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20  ber is the root 
369d0 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62  page of.** a tab
369e0 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68  le.  nRoot is th
369f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
36a00 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a  ies in aRoot..**
36a10 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75  .** Write the nu
36a20 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 20 73 65  mber of error se
36a30 65 6e 20 69 6e 20 2a 70 6e 45 72 72 2e 20 20 45  en in *pnErr.  E
36a40 78 63 65 70 74 20 66 6f 72 20 73 6f 6d 65 20 6d  xcept for some m
36a50 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
36a60 69 6f 6e 20 65 72 72 6f 72 73 2c 20 20 61 6e 20  ion errors,  an 
36a70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65  error message he
36a80 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ld in memory obt
36a90 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61  ained from.** ma
36aa0 6c 6c 6f 63 20 69 73 20 72 65 74 75 72 6e 65 64  lloc is returned
36ab0 20 69 66 20 2a 70 6e 45 72 72 20 69 73 20 6e 6f   if *pnErr is no
36ac0 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 2a 70 6e 45  n-zero.  If *pnE
36ad0 72 72 3d 3d 30 20 74 68 65 6e 20 4e 55 4c 4c 20  rr==0 then NULL 
36ae0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
36af0 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
36b00 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
36b10 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
36b20 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
36b30 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74  *sqlite3BtreeInt
36b40 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42  egrityCheck(.  B
36b50 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20  tree *p,     /* 
36b60 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  The btree to be 
36b70 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  checked */.  int
36b80 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e   *aRoot,   /* An
36b90 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70   array of root p
36ba0 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  ages numbers for
36bb0 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65   individual tree
36bc0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  s */.  int nRoot
36bd0 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ,    /* Number o
36be0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
36bf0 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ot[] */.  int mx
36c00 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20  Err,    /* Stop 
36c10 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73  reporting errors
36c20 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79   after this many
36c30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72   */.  int *pnErr
36c40 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d      /* Write num
36c50 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
36c60 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  en to this varia
36c70 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ble */.){.  Pgno
36c80 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a   i;.  int nRef;.
36c90 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43    IntegrityCk sC
36ca0 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64  heck;.  BtShared
36cb0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
36cc0 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30 5d    char zErr[100]
36cd0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
36ce0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
36cf0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
36d00 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
36d10 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
36d20 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
36d30 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
36d40 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ry(p)!=SQLITE_OK
36d50 20 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d   ){.    *pnErr =
36d60 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   1;.    sqlite3B
36d70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
36d80 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
36d90 44 62 53 74 72 44 75 70 28 30 2c 20 22 63 61 6e  DbStrDup(0, "can
36da0 6e 6f 74 20 61 63 71 75 69 72 65 20 61 20 72 65  not acquire a re
36db0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
36dc0 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20  atabase");.  }. 
36dd0 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42   sCheck.pBt = pB
36de0 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67  t;.  sCheck.pPag
36df0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
36e00 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  ;.  sCheck.nPage
36e10 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
36e20 74 28 73 43 68 65 63 6b 2e 70 42 74 29 3b 0a 20  t(sCheck.pBt);. 
36e30 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20   sCheck.mxErr = 
36e40 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e  mxErr;.  sCheck.
36e50 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 43 68 65  nErr = 0;.  sChe
36e60 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  ck.mallocFailed 
36e70 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20  = 0;.  *pnErr = 
36e80 30 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e  0;.  if( sCheck.
36e90 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
36ea0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
36eb0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71  sed(pBt);.    sq
36ec0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
36ed0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  p);.    return 0
36ee0 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61  ;.  }.  sCheck.a
36ef0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 4d 61  nRef = sqlite3Ma
36f00 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e 6e 50  lloc( (sCheck.nP
36f10 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43  age+1)*sizeof(sC
36f20 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29  heck.anRef[0]) )
36f30 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e  ;.  if( !sCheck.
36f40 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c  anRef ){.    unl
36f50 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
36f60 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72  (pBt);.    *pnEr
36f70 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  r = 1;.    sqlit
36f80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
36f90 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
36fa0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
36fb0 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69  =sCheck.nPage; i
36fc0 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65  ++){ sCheck.anRe
36fd0 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20  f[i] = 0; }.  i 
36fe0 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
36ff0 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20  AGE(pBt);.  if( 
37000 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
37010 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e  ){.    sCheck.an
37020 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Ref[i] = 1;.  }.
37030 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
37040 6d 49 6e 69 74 28 26 73 43 68 65 63 6b 2e 65 72  mInit(&sCheck.er
37050 72 4d 73 67 2c 20 7a 45 72 72 2c 20 73 69 7a 65  rMsg, zErr, size
37060 6f 66 28 7a 45 72 72 29 2c 20 32 30 30 30 30 29  of(zErr), 20000)
37070 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
37080 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
37090 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f  he freelist.  */
370a0 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43  .  checkList(&sC
370b0 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74  heck, 1, get4byt
370c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
370d0 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20  aData[32]),.    
370e0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
370f0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
37100 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e  Data[36]), "Main
37110 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a   freelist: ");..
37120 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74    /* Check all t
37130 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  he tables..  */.
37140 20 20 66 6f 72 28 69 3d 30 3b 20 28 69 6e 74 29    for(i=0; (int)
37150 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63  i<nRoot && sChec
37160 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20  k.mxErr; i++){. 
37170 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d     if( aRoot[i]=
37180 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  =0 ) continue;.#
37190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
371a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
371b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
371c0 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69  acuum && aRoot[i
371d0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ]>1 ){.      che
371e0 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b  ckPtrmap(&sCheck
371f0 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d  , aRoot[i], PTRM
37200 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
37210 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
37220 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61  .    checkTreePa
37230 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f  ge(&sCheck, aRoo
37240 74 5b 69 5d 2c 20 22 4c 69 73 74 20 6f 66 20 74  t[i], "List of t
37250 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20  ree roots: ");. 
37260 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
37270 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e  re every page in
37280 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 66   the file is ref
37290 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66  erenced.  */.  f
372a0 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63  or(i=1; i<=sChec
372b0 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65 63  k.nPage && sChec
372c0 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23  k.mxErr; i++){.#
372d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
372e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
372f0 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65   if( sCheck.anRe
37300 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f[i]==0 ){.     
37310 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
37320 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67  &sCheck, 0, "Pag
37330 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73  e %d is never us
37340 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23  ed", i);.    }.#
37350 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 74  else.    /* If t
37360 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
37370 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
37380 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 74  , make sure no t
37390 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20  ables contain.  
373a0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
373b0 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  to pointer-map p
373c0 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ages..    */.   
373d0 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65   if( sCheck.anRe
373e0 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20  f[i]==0 && .    
373f0 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e     (PTRMAP_PAGEN
37400 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20  O(pBt, i)!=i || 
37410 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
37420 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
37430 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
37440 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20 69  k, 0, "Page %d i
37450 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69  s never used", i
37460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
37470 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
37480 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  !=0 && .       (
37490 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
374a0 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d  t, i)==i && pBt-
374b0 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a  >autoVacuum) ){.
374c0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
374d0 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
374e0 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61   "Pointer map pa
374f0 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65 6e  ge %d is referen
37500 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ced", i);.    }.
37510 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
37520 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
37530 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f 74  analysis did not
37540 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65 66   leave any unref
37550 28 29 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 54  () pages..  ** T
37560 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
37570 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63  al consistency c
37580 68 65 63 6b 3b 20 61 6e 20 69 6e 74 65 67 72 69  heck; an integri
37590 74 79 20 63 68 65 63 6b 0a 20 20 2a 2a 20 6f 66  ty check.  ** of
375a0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 63   the integrity c
375b0 68 65 63 6b 2e 0a 20 20 2a 2f 0a 20 20 75 6e 6c  heck..  */.  unl
375c0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
375d0 28 70 42 74 29 3b 0a 20 20 69 66 28 20 4e 45 56  (pBt);.  if( NEV
375e0 45 52 28 6e 52 65 66 20 21 3d 20 73 71 6c 69 74  ER(nRef != sqlit
375f0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
37600 70 42 74 2d 3e 70 50 61 67 65 72 29 29 20 29 7b  pBt->pPager)) ){
37610 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
37620 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
37630 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64  .      "Outstand
37640 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67  ing page count g
37650 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  oes from %d to %
37660 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e  d during this an
37670 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e  alysis",.      n
37680 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65  Ref, sqlite3Page
37690 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
376a0 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
376b0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75  }..  /* Clean  u
376c0 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72  p and report err
376d0 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ors..  */.  sqli
376e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
376f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
37700 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a  (sCheck.anRef);.
37710 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6d 61 6c    if( sCheck.mal
37720 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
37730 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
37740 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72  Reset(&sCheck.er
37750 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45 72  rMsg);.    *pnEr
37760 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 2b  r = sCheck.nErr+
37770 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
37780 0a 20 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d 20  .  }.  *pnErr = 
37790 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69  sCheck.nErr;.  i
377a0 66 28 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d  f( sCheck.nErr==
377b0 30 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  0 ) sqlite3StrAc
377c0 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b  cumReset(&sCheck
377d0 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75  .errMsg);.  retu
377e0 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  rn sqlite3StrAcc
377f0 75 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63 6b  umFinish(&sCheck
37800 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64  .errMsg);.}.#end
37810 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
37820 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
37830 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
37840 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
37850 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
37860 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
37870 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
37880 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69  pager filename i
37890 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
378a0 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
378b0 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
378c0 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
378d0 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
378e0 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
378f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
37900 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
37910 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  lename(Btree *p)
37920 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
37930 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
37940 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
37950 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
37960 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
37970 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37980 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
37990 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
379a0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
379b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
379c0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64  *.** The pager d
379d0 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73  irectory name is
379e0 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f   invariant as lo
379f0 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ng as the pager 
37a00 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74  is.** open so it
37a10 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65   is safe to acce
37a20 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42  ss without the B
37a30 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a  tShared mutex..*
37a40 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
37a50 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
37a60 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
37a70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
37a80 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
37a90 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
37aa0 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70  agerDirname(p->p
37ab0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
37ac0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
37ad0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
37ae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
37af0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
37b00 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
37b10 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75  alue of this rou
37b20 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65  tine is the same
37b30 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
37b40 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  hether the journ
37b50 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  al file.** has b
37b60 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e  een created or n
37b70 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ot..**.** The pa
37b80 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ger journal file
37b90 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e  name is invarian
37ba0 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  t as long as the
37bb0 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65   pager is.** ope
37bc0 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20  n so it is safe 
37bd0 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75  to access withou
37be0 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d  t the BtShared m
37bf0 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  utex..*/.const c
37c00 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
37c10 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
37c20 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
37c30 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
37c40 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
37c50 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  rn sqlite3PagerJ
37c60 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42  ournalname(p->pB
37c70 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23  t->pPager);.}..#
37c80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37c90 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
37ca0 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74  Copy the complet
37cb0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74  e content of pBt
37cc0 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e  From into pBtTo.
37cd0 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a    A transaction.
37ce0 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  ** must be activ
37cf0 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73  e for both files
37d00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ..**.** The size
37d10 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79   of file pTo may
37d20 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74   be reduced by t
37d30 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
37d40 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
37d50 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72  es wrong, the tr
37d60 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f  ansaction on pTo
37d70 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
37d80 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
37d90 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61  ssful, CommitPha
37da0 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63  seOne() may be c
37db0 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66  alled on pTo bef
37dc0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a  ore returning. .
37dd0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
37de0 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d  ould finish comm
37df0 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  itting the trans
37e00 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79  action on pTo by
37e10 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
37e20 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
37e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37e40 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  btreeCopyFile(Bt
37e50 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
37e60 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
37e70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37e80 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f   Pgno i;..  Pgno
37e90 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20   nFromPage;     
37ea0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
37eb0 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20  es in pFrom */. 
37ec0 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20   Pgno nToPage;  
37ed0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37ee0 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a  f pages in pTo *
37ef0 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67  /.  Pgno nNewPag
37f00 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  e;      /* Numbe
37f10 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54  r of pages in pT
37f20 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f 70 79  o after the copy
37f30 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69   */..  Pgno iSki
37f40 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65  p;         /* Pe
37f50 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67 65 20  nding byte page 
37f60 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20  in pTo */.  int 
37f70 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20  nToPageSize;    
37f80 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20  /* Page size of 
37f90 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  pTo in bytes */.
37fa0 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53    int nFromPageS
37fb0 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69  ize;  /* Page si
37fc0 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62  ze of pFrom in b
37fd0 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61  ytes */..  BtSha
37fe0 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f  red *pBtTo = pTo
37ff0 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65  ->pBt;.  BtShare
38000 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72  d *pBtFrom = pFr
38010 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f  om->pBt;.  pBtTo
38020 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a  ->db = pTo->db;.
38030 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20    pBtFrom->db = 
38040 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54  pFrom->db;..  nT
38050 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54  oPageSize = pBtT
38060 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e  o->pageSize;.  n
38070 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70  FromPageSize = p
38080 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65  BtFrom->pageSize
38090 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
380a0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
380b0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
380c0 72 74 28 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61  rt( pFrom->inTra
380d0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
380e0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
380f0 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 29 20 29  BtTo->pCursor) )
38100 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
38110 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
38120 20 6e 54 6f 50 61 67 65 20 3d 20 70 61 67 65 72   nToPage = pager
38130 50 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 29  Pagecount(pBtTo)
38140 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d 20  ;.  nFromPage = 
38150 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
38160 42 74 46 72 6f 6d 29 3b 0a 20 20 69 53 6b 69 70  BtFrom);.  iSkip
38170 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
38180 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 0a 20 20  PAGE(pBtTo);..  
38190 2f 2a 20 56 61 72 69 61 62 6c 65 20 6e 4e 65 77  /* Variable nNew
381a0 50 61 67 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Page is the numb
381b0 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 71 75  er of pages requ
381c0 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
381d0 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  e.  ** contents 
381e0 6f 66 20 70 46 72 6f 6d 20 75 73 69 6e 67 20 74  of pFrom using t
381f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2d  he current page-
38200 73 69 7a 65 20 6f 66 20 70 54 6f 2e 0a 20 20 2a  size of pTo..  *
38210 2f 0a 20 20 6e 4e 65 77 50 61 67 65 20 3d 20 28  /.  nNewPage = (
38220 50 67 6e 6f 29 0a 20 20 20 20 20 28 28 28 69 36  Pgno).     (((i6
38230 34 29 6e 46 72 6f 6d 50 61 67 65 2a 28 69 36 34  4)nFromPage*(i64
38240 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 2b 28  )nFromPageSize+(
38250 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 2d  i64)nToPageSize-
38260 31 29 2f 28 69 36 34 29 6e 54 6f 50 61 67 65 53  1)/(i64)nToPageS
38270 69 7a 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31  ize);..  for(i=1
38280 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
38290 26 26 20 28 69 3c 3d 6e 54 6f 50 61 67 65 20 7c  && (i<=nToPage |
382a0 7c 20 69 3c 3d 6e 4e 65 77 50 61 67 65 29 3b 20  | i<=nNewPage); 
382b0 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f  i++){..    /* Jo
382c0 75 72 6e 61 6c 20 74 68 65 20 6f 72 69 67 69 6e  urnal the origin
382d0 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  al page..    **.
382e0 20 20 20 20 2a 2a 20 69 53 6b 69 70 20 69 73 20      ** iSkip is 
382f0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
38300 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  of the locking p
38310 61 67 65 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  age (PENDING_BYT
38320 45 5f 50 41 47 45 29 0a 20 20 20 20 2a 2a 20 69  E_PAGE).    ** i
38330 6e 20 64 61 74 61 62 61 73 65 20 2a 70 54 6f 20  n database *pTo 
38340 28 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79  (before the copy
38350 29 2e 20 54 68 69 73 20 70 61 67 65 20 69 73 20  ). This page is 
38360 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 0a 20  never written . 
38370 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6a     ** into the j
38380 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 55 6e 6c  ournal file. Unl
38390 65 73 73 20 69 3d 3d 69 53 6b 69 70 20 6f 72 20  ess i==iSkip or 
383a0 74 68 65 20 70 61 67 65 20 77 61 73 20 6e 6f 74  the page was not
383b0 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  .    ** present 
383c0 69 6e 20 70 54 6f 20 62 65 66 6f 72 65 20 74 68  in pTo before th
383d0 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e  e copy operation
383e0 2c 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  , journal page i
383f0 20 66 72 6f 6d 20 70 54 6f 2e 0a 20 20 20 20 2a   from pTo..    *
38400 2f 0a