/ Hex Artifact Content
Login

Artifact 5406b753fbab8b3ff36cc1378d3f8fe329b667c0:


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 33 32 20 32 30 30 38 2f 31  c,v 1.532 2008/1
0190: 31 2f 31 32 20 30 34 3a 35 35 3a 33 34 20 73 68  1/12 04:55:34 sh
01a0: 61 6e 65 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20  ane Exp $.**.** 
01b0: 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d  This file implem
01c0: 65 6e 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20  ents a external 
01d0: 28 64 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74  (disk-based) dat
01e0: 61 62 61 73 65 20 75 73 69 6e 67 20 42 54 72 65  abase using BTre
01f0: 65 73 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  es..** See the h
0200: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
0210: 20 22 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f   "btreeInt.h" fo
0220: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
0230: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63  ormation..** Inc
0240: 6c 75 64 69 6e 67 20 61 20 64 65 73 63 72 69 70  luding a descrip
0250: 74 69 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72  tion of file for
0260: 6d 61 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76  mat and an overv
0270: 69 65 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  iew of operation
0280: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62  ..*/.#include "b
0290: 74 72 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  treeInt.h"../*.*
02a0: 2a 20 54 68 65 20 68 65 61 64 65 72 20 73 74 72  * The header str
02b0: 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
02c0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
02d0: 67 20 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51  g of every.** SQ
02e0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a  Lite database..*
02f0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
0300: 68 61 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72  har zMagicHeader
0310: 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45  [] = SQLITE_FILE
0320: 5f 48 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20  _HEADER;../*.** 
0330: 53 65 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20  Set this global 
0340: 76 61 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f  variable to 1 to
0350: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
0360: 75 73 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a  using the TRACE.
0370: 2a 2a 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  ** macro..*/.#if
0380: 20 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74   0.int sqlite3Bt
0390: 72 65 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20  reeTrace=0;  /* 
03a0: 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74  True to enable t
03b0: 72 61 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69  racing */.# defi
03c0: 6e 65 20 54 52 41 43 45 28 58 29 20 20 69 66 28  ne TRACE(X)  if(
03d0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 61 63  sqlite3BtreeTrac
03e0: 65 29 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75  e){printf X;fflu
03f0: 73 68 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c  sh(stdout);}.#el
0400: 73 65 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43  se.# define TRAC
0410: 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(X).#endif../*.
0420: 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 65 20  ** Sometimes we 
0430: 6e 65 65 64 20 61 20 73 6d 61 6c 6c 20 61 6d 6f  need a small amo
0440: 75 6e 74 20 6f 66 20 63 6f 64 65 20 73 75 63 68  unt of code such
0450: 20 61 73 20 61 20 76 61 72 69 61 62 6c 65 20 69   as a variable i
0460: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
0470: 20 74 6f 20 73 65 74 75 70 20 66 6f 72 20 61 20   to setup for a 
0480: 6c 61 74 65 72 20 61 73 73 65 72 74 28 29 20 73  later assert() s
0490: 74 61 74 65 6d 65 6e 74 2e 20 20 57 65 20 64 6f  tatement.  We do
04a0: 20 6e 6f 74 20 77 61 6e 74 20 74 68 69 73 20 63   not want this c
04b0: 6f 64 65 20 74 6f 0a 2a 2a 20 61 70 70 65 61 72  ode to.** appear
04c0: 20 77 68 65 6e 20 61 73 73 65 72 74 28 29 20 69   when assert() i
04d0: 73 20 64 69 73 61 62 6c 65 64 2e 20 20 54 68 65  s disabled.  The
04e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
04f0: 20 69 73 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a   is therefore.**
0500: 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e   used to contain
0510: 20 74 68 61 74 20 73 65 74 75 70 20 63 6f 64 65   that setup code
0520: 2e 20 20 54 68 65 20 22 56 56 41 22 20 61 63 72  .  The "VVA" acr
0530: 6f 6e 79 6d 20 73 74 61 6e 64 73 20 66 6f 72 0a  onym stands for.
0540: 2a 2a 20 22 56 65 72 69 66 69 63 61 74 69 6f 6e  ** "Verification
0550: 2c 20 56 61 6c 69 64 61 74 69 6f 6e 2c 20 61 6e  , Validation, an
0560: 64 20 41 63 63 72 65 64 69 74 61 74 69 6f 6e 22  d Accreditation"
0570: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
0580: 73 2c 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  s, the.** code w
0590: 69 74 68 69 6e 20 56 56 41 5f 4f 4e 4c 59 28 29  ithin VVA_ONLY()
05a0: 20 77 69 6c 6c 20 6f 6e 6c 79 20 72 75 6e 20 64   will only run d
05b0: 75 72 69 6e 67 20 76 65 72 69 66 69 63 61 74 69  uring verificati
05c0: 6f 6e 20 70 72 6f 63 65 73 73 65 73 2e 0a 2a 2f  on processes..*/
05d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
05e0: 23 20 64 65 66 69 6e 65 20 56 56 41 5f 4f 4e 4c  # define VVA_ONL
05f0: 59 28 58 29 20 20 58 0a 23 65 6c 73 65 0a 23 20  Y(X)  X.#else.# 
0600: 64 65 66 69 6e 65 20 56 56 41 5f 4f 4e 4c 59 28  define VVA_ONLY(
0610: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  X).#endif....#if
0620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0640: 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0650: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0660: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0670: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0680: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0690: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
06a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
06b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
06c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
06d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
06e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
06f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0700: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0710: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0720: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0730: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0740: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0750: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0760: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0770: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0780: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
0790: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
07a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
07b0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
07c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
07d0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
07e0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
07f0: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0800: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0810: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0820: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0830: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0840: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0850: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0860: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0870: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0880: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0890: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
08a0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
08b0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
08c0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
08d0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
08e0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
08f0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0900: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0910: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0930: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0940: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0950: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0960: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
0970: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0980: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
0990: 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  nt checkReadLock
09a0: 73 28 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20  s(Btree*, Pgno, 
09b0: 42 74 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b  BtCursor*, i64);
09c0: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
09d0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
09e0: 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  HE.  /*.  ** The
09f0: 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79   functions query
0a00: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63  TableLock(), loc
0a10: 6b 54 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c  kTable() and unl
0a20: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20  ockAllTables(). 
0a30: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0a40: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0a50: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0a60: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0a70: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
0a80: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
0a90: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
0aa0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
0ab0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
0ac0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
0ad0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0ae0: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0af0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0b00: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0b10: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0b20: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0b30: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0b40: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0b50: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0b60: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0b70: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
0b80: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
0b90: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61  queryTableLock(a
0ba0: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
0bb0: 20 20 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61    #define lockTa
0bc0: 62 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ble(a,b,c) SQLIT
0bd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75  E_OK.  #define u
0be0: 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61  nlockAllTables(a
0bf0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
0c00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0c10: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
0c20: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
0c30: 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   btree handle p 
0c40: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
0c50: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
0c60: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
0c70: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
0c80: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
0c90: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
0ca0: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
0cb0: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
0cc0: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
0cd0: 28 62 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b  (by calling lock
0ce0: 54 61 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20  Table()), or.** 
0cf0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
0d00: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
0d10: 69 6e 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  int queryTableLo
0d20: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
0d30: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
0d40: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
0d50: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
0d60: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
0d70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
0d80: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
0d90: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
0da0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0db0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
0dc0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
0dd0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
0de0: 20 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61   .  /* This is a
0df0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
0e00: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
0e10: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
0e20: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
0e30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0e40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
0e50: 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72  /* If some other
0e60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
0e70: 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  olding an exclus
0e80: 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20  ive lock, the.  
0e90: 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  ** requested loc
0ea0: 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74  k may not be obt
0eb0: 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ained..  */.  if
0ec0: 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  ( pBt->pExclusiv
0ed0: 65 20 26 26 20 70 42 74 2d 3e 70 45 78 63 6c 75  e && pBt->pExclu
0ee0: 73 69 76 65 21 3d 70 20 29 7b 0a 20 20 20 20 72  sive!=p ){.    r
0ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
0f00: 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  KED;.  }..  /* T
0f10: 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20  his (along with 
0f20: 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20 69 73 20  lockTable()) is 
0f30: 77 68 65 72 65 20 74 68 65 20 52 65 61 64 55 6e  where the ReadUn
0f40: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
0f50: 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  s.  ** dealt wit
0f60: 68 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  h. If the caller
0f70: 20 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72   is querying for
0f80: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64   a read-lock and
0f90: 20 74 68 65 20 66 6c 61 67 20 69 73 0a 20 20 2a   the flag is.  *
0fa0: 2a 20 73 65 74 2c 20 69 74 20 69 73 20 75 6e 63  * set, it is unc
0fb0: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61  onditionally gra
0fc0: 6e 74 65 64 20 2d 20 65 76 65 6e 20 69 66 20 74  nted - even if t
0fd0: 68 65 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c  here are write-l
0fe0: 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ocks.  ** on the
0ff0: 20 74 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69   table. If a wri
1000: 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  te-lock is reque
1010: 73 74 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e  sted, the ReadUn
1020: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20  committed flag. 
1030: 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69   ** is not consi
1040: 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dered..  **.  **
1050: 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63   In function loc
1060: 6b 54 61 62 6c 65 28 29 2c 20 69 66 20 61 20 72  kTable(), if a r
1070: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61  ead-lock is dema
1080: 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a 20 20  nded and the .  
1090: 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  ** ReadUncommitt
10a0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
10b0: 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64 64 65  no entry is adde
10c0: 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c  d to the locks l
10d0: 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53 68 61  ist .  ** (BtSha
10e0: 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a  red.pLock)..  **
10f0: 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69  .  ** To summari
1100: 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61 64 55  ze: If the ReadU
1110: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1120: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65 61  is set, then rea
1130: 64 20 63 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a  d cursors do.  *
1140: 2a 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20  * not create or 
1150: 72 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f  respect table lo
1160: 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67  cks. The locking
1170: 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61   procedure for a
1180: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63 75 72   .  ** write-cur
1190: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  sor does not cha
11a0: 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
11b0: 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e  .    0==(p->db->
11c0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
11d0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c  dUncommitted) ||
11e0: 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49   .    eLock==WRI
11f0: 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69  TE_LOCK ||.    i
1200: 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  Tab==MASTER_ROOT
1210: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  .  ){.    for(pI
1220: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
1230: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
1240: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1250: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1260: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
1270: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
1280: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 74   .          (pIt
1290: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
12a0: 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45 41 44 5f   || eLock!=READ_
12b0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  LOCK) ){.       
12c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
12d0: 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  OCKED;.      }. 
12e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1300: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
1310: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1320: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
1330: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1340: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
1350: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
1360: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1370: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
1380: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
1390: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
13a0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
13b0: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
13c0: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
13d0: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
13e0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
13f0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1400: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
1410: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
1420: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
1430: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
1440: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
1450: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
1460: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 61  tatic int lockTa
1470: 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ble(Btree *p, Pg
1480: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
1490: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
14a0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14b0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
14c0: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
14d0: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
14e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
14f0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1500: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
1510: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
1520: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
1530: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
1540: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  !=0 );..  /* Thi
1550: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1560: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1570: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1580: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1590: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
15a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15b0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
15c0: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 54 61  LITE_OK==queryTa
15d0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
15e0: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
15f0: 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75  /* If the read-u
1600: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1610: 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61  is set and a rea
1620: 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  d-lock is reques
1630: 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ted,.  ** return
1640: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 61   early without a
1650: 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74  dding an entry t
1660: 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  o the BtShared.p
1670: 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20  Lock list. See. 
1680: 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66   ** comment in f
1690: 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54 61 62  unction queryTab
16a0: 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72  leLock() for mor
16b0: 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64 6c 69  e info on handli
16c0: 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52 65 61  ng .  ** the Rea
16d0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
16e0: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
16f0: 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73     (p->db->flags
1700: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1710: 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20 20  mmitted) && .   
1720: 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f   (eLock==READ_LO
1730: 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c  CK) &&.    iTabl
1740: 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  e!=MASTER_ROOT. 
1750: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1760: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1770: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
1780: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
1790: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
17a0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
17b0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
17c0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
17d0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
17e0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
17f0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1800: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
1810: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1820: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
1830: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1840: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1850: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
1860: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
1870: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
1880: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
1890: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
18a0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
18b0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
18c0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
18d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
18e0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
18f0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
1900: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1910: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
1920: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
1930: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1940: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1950: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
1960: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
1970: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
1980: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
1990: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
19a0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
19b0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
19c0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
19d0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
19e0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
19f0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
1a00: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
1a10: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1a20: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
1a30: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
1a40: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
1a50: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
1a60: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
1a70: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
1a80: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
1a90: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
1aa0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
1ab0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
1ac0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
1ae0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
1af0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
1b00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b10: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1b20: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b30: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1b40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b50: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1b60: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
1b70: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
1b80: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
1b90: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f 63  calls to the loc
1ba0: 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f 63  kTable().** proc
1bb0: 65 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42  edure) held by B
1bc0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a  tree handle p..*
1bd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
1be0: 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42 74  lockAllTables(Bt
1bf0: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1c00: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1c10: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70  t;.  BtLock **pp
1c20: 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f  Iter = &pBt->pLo
1c30: 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ck;..  assert( s
1c40: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1c50: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1c60: 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c  sert( p->sharabl
1c70: 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20  e || 0==*ppIter 
1c80: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
1c90: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
1ca0: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
1cb0: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
1cc0: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
1cd0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 45 78 63  ==0 || pBt->pExc
1ce0: 6c 75 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d 3e 70  lusive==pLock->p
1cf0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 69 66 28  Btree );.    if(
1d00: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
1d10: 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74  p ){.      *ppIt
1d20: 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78  er = pLock->pNex
1d30: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
1d40: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
1d50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1d60: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
1d70: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1d80: 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78  ..  if( pBt->pEx
1d90: 63 6c 75 73 69 76 65 3d 3d 70 20 29 7b 0a 20 20  clusive==p ){.  
1da0: 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76    pBt->pExclusiv
1db0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  e = 0;.  }.}.#en
1dc0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1dd0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
1de0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
1df0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
1e00: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
1e10: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1e20: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  ce */../*.** Ver
1e30: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
1e40: 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65  sor holds a mute
1e50: 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
1e60: 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  d.*/.#ifndef NDE
1e70: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
1e80: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e90: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1ea0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
1eb0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
1ec0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
1ed0: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
1ee0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1ef0: 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  B./*.** Invalida
1f00: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1f10: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1f20: 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c  for cursor pCur,
1f30: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
1f40: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
1f50: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1f60: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1f70: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f80: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f90: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
1fa0: 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
1fb0: 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f  low);.  pCur->aO
1fc0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a  verflow = 0;.}..
1fd0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
1fe0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1ff0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
2000: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
2010: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
2020: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
2030: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
2040: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
2050: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
2060: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
2070: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
2080: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
2090: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20a0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
20b0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
20c0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
20d0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
20e0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
20f0: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  e(p);.  }.}.#els
2100: 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  e.  #define inva
2110: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
2120: 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65  che(x).  #define
2130: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
2140: 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 23  erflowCache(x).#
2150: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  endif../*.** Sav
2160: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
2170: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
2180: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
2190: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
21a0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
21b0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
21c0: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
21d0: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
21e0: 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  EEK..*/.static i
21f0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
2200: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
2210: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2220: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
2230: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2240: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
2250: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
2260: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
2270: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2280: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
2290: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
22a0: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
22b0: 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49  ->nKey);..  /* I
22c0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
22d0: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
22e0: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
22f0: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
2300: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
2310: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
2320: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
2330: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
2340: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
2350: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
2360: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
2370: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
2380: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
2390: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
23a0: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
23b0: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
23c0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
23d0: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
23e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
23f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
2400: 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
2410: 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76  ->intKey){.    v
2420: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
2430: 74 65 33 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e  te3Malloc(pCur->
2440: 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70  nKey);.    if( p
2450: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
2460: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
2470: 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d  y(pCur, 0, pCur-
2480: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
2490: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24b0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
24c0: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
24d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24e0: 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
24f0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2500: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2510: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2520: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43   }.  assert( !pC
2530: 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2540: 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e  ntKey || !pCur->
2550: 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72  pKey );..  if( r
2560: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2570: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
2580: 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
2590: 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
25a0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
25b0: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
25c0: 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 70  ;.      pCur->ap
25d0: 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
25e0: 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
25f0: 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75  ge = -1;.    pCu
2600: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2610: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
2620: 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74    }..  invalidat
2630: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
2640: 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
2650: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
2660: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2670: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78  f all cursors ex
2680: 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70 65  cept pExcept ope
2690: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
26a0: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  ** with root-pag
26b0: 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79  e iRoot. Usually
26c0: 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  , this is called
26d0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
26e0: 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69  sor.** pExcept i
26f0: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
2700: 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65   the table (Btre
2710: 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2720: 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a  eeInsert())..*/.
2730: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
2740: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
2750: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
2760: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
2770: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
2780: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
2790: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
27a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
27b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
27c0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
27d0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
27e0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
27f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2800: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
2810: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
2820: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
2830: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26  oRoot==iRoot) &&
2840: 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74   .        p->eSt
2850: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2860: 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
2870: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
2880: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
2890: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
28a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
28b0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
28f0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2900: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
2910: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
2920: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
2930: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
2940: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2950: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2960: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2970: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
2980: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
2990: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29a0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
29b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
29c0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
29d0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
29e0: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
29f0: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
2a00: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
2a10: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
2a20: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
2a30: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
2a40: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
2a50: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
2a60: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
2a70: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2a80: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
2a90: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
2aa0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
2ab0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2ac0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
2ad0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
2ae0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
2af0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2b00: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
2b10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
2b20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
2b30: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2b40: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2b50: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b60: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
2b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2b80: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2b90: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2ba0: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
2bb0: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
2bc0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
2bd0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2be0: 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ID;.  rc = sqlit
2bf0: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2c00: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
2c10: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
2c20: 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69  pCur->skip);.  i
2c30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2c50: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
2c60: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
2c70: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2c80: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2c90: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2ca0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cb0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
2cc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2cd0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
2ce0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2cf0: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
2d00: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
2d10: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
2d20: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2d30: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
2d40: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
2d50: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
2d60: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
2d70: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
2d80: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
2d90: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
2da0: 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73  sition it.** was
2db0: 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e   last placed at.
2dc0: 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f    Cursors can mo
2dd0: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
2de0: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
2df0: 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74  g.** at is delet
2e00: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
2e10: 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r them..**.** Th
2e20: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2e30: 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ns an error code
2e40: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
2e50: 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a  es wrong.  The.*
2e60: 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d  * integer *pHasM
2e70: 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f  oved is set to o
2e80: 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ne if the cursor
2e90: 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30   has moved and 0
2ea0: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20   if not..*/.int 
2eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
2ec0: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
2ed0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2ee0: 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e  pHasMoved){.  in
2ef0: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  t rc;..  rc = re
2f00: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2f10: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
2f20: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73   rc ){.    *pHas
2f30: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  Moved = 1;.    r
2f40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2f50: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2f60: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2f70: 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30 20  | pCur->skip!=0 
2f80: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
2f90: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
2fa0: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
2fb0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
2fc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2fd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fe0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
2ff0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
3000: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
3010: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
3020: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
3030: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
3040: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
3050: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
3060: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
3070: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
3080: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
3090: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
30a0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
30b0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
30c0: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
30d0: 50 65 72 4d 61 70 50 61 67 65 2c 20 69 50 74 72  PerMapPage, iPtr
30e0: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
30f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3100: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3110: 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65  x) );.  nPagesPe
3120: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
3130: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
3140: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
3150: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
3160: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
3170: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
3180: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
3190: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
31a0: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31b0: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
31c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
31d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
31e0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
31f0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
3200: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3210: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
3220: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
3230: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
3240: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
3250: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
3260: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
3270: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
3280: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e  er 'pgno'..** An
3290: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
32a0: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
32b0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
32c0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
32d0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
32e0: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74  int ptrmapPut(Bt
32f0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
3300: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
3310: 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20   Pgno parent){. 
3320: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
3330: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
3340: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
3350: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
3360: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
3370: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
3380: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
3390: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
33a0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
33b0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
33c0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
33d0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
33e0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
33f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
3400: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3410: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3420: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
3430: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
3440: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
3450: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
3460: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
3470: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
3480: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
3490: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34a0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
34b0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
34c0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
34d0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
34e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34f0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
3500: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
3510: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
3520: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
3530: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
3540: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
3550: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
3560: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3570: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
3580: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
3590: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
35a0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
35b0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
35c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
35d0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
35e0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
35f0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
3600: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
3610: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
3620: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
3630: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
3640: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
3650: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
3660: 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d  rent));.    rc =
3670: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
3680: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
3690: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
36b0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
36c0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
36d0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
36e0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
36f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
3700: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
3710: 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75  pDbPage);.  retu
3720: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3730: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
3740: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
3750: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
3760: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
3770: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
3780: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
3790: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
37a0: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
37b0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
37c0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
37d0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
37e0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
37f0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
3800: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
3810: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
3820: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
3830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
3840: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
3850: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
3860: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
3870: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
3880: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
3890: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
38a0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
38b0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
38c0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
38d0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
38e0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
38f0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
3900: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
3910: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
3920: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
3930: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
3940: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
3950: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
3960: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3970: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3980: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3990: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
39a0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
39b0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
39c0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
39d0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
39e0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
39f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
3a00: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
3a10: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
3a20: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
3a30: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
3a40: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
3a50: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73  rmap, key);.  as
3a60: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
3a70: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
3a80: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
3a90: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
3aa0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
3ab0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
3ac0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
3ad0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
3ae0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
3af0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
3b00: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
3b10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
3b20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3b30: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
3b40: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
3b50: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
3b60: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
3b70: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29  rmapPut(w,x,y,z)
3b80: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
3b90: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
3ba0: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
3bb0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
3bc0: 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a 29 20 53  apPutOvfl(y,z) S
3bd0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
3be0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62  ./*.** Given a b
3bf0: 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20  tree page and a 
3c00: 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65  cell index (0 me
3c10: 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65  ans the first ce
3c20: 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  ll on.** the pag
3c30: 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73  e, 1 means the s
3c40: 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20  econd cell, and 
3c50: 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e  so forth) return
3c60: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
3c70: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
3c80: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
3c90: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
3ca0: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
3cb0: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
3cc0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
3cd0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
3ce0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
3cf0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
3d00: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
3d10: 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b  yte(&(P)->aData[
3d20: 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  (P)->cellOffset+
3d30: 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a  2*(I)])))../*.**
3d40: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
3d50: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
3d60: 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  findCell() that 
3d70: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
3d80: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
3d90: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
3da0: 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a  s.  See insert.*
3db0: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e  /.static u8 *fin
3dc0: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65  dOverflowCell(Me
3dd0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
3de0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20  t iCell){.  int 
3df0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
3e00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3e10: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
3e20: 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50  x) );.  for(i=pP
3e30: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31  age->nOverflow-1
3e40: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
3e50: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72    int k;.    str
3e60: 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70  uct _OvflCell *p
3e70: 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20  Ovfl;.    pOvfl 
3e80: 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  = &pPage->aOvfl[
3e90: 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66  i];.    k = pOvf
3ea0: 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20  l->idx;.    if( 
3eb0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
3ec0: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
3ed0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3ee0: 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20   pOvfl->pCell;. 
3ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65       }.      iCe
3f00: 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ll--;.    }.  }.
3f10: 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c    return findCel
3f20: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
3f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
3f40: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
3f50: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
3f60: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
3f70: 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a  ructure.  There.
3f80: 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69  ** are two versi
3f90: 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ons of this func
3fa0: 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74  tion.  sqlite3Bt
3fb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
3fc0: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
3fd0: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
3fe0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
3ff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4000: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
4010: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
4020: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
4030: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
4040: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
4050: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
4060: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
4070: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
4080: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
4090: 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ead of.** sqlite
40a0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
40b0: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
40c0: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
40d0: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
40e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
40f0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
4100: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
4110: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
4120: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
4130: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
4140: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
4150: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
4160: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
4170: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
4180: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
4190: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
41a0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
41b0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
41c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
41d0: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
41e0: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
41f0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
4200: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
4210: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
4220: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
4230: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
4240: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
4250: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
4260: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
4270: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
4280: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4290: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
42a0: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
42b0: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
42c0: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
42d0: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
42e0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
42f0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
4300: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
4310: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
4320: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
4330: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
4340: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
4350: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
4360: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
4370: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
4380: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
4390: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
43a0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
43b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
43c0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
43d0: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
43e0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
43f0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
4400: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
4410: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
4420: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
4430: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
4440: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
4450: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28  eader = n;.  if(
4460: 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64   likely(nPayload
4470: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
4480: 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  l) ){.    /* Thi
4490: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
44a0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
44b0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
44c0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
44d0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
44e0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
44f0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
4500: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69    */.    int nSi
4510: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze;          /* 
4520: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65  Total size of ce
4530: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79  ll content in by
4540: 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65  tes */.    nSize
4550: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b   = nPayload + n;
4560: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
4570: 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  al = nPayload;. 
4580: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
4590: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  low = 0;.    if(
45a0: 20 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30   (nSize & ~3)==0
45b0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
45c0: 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  = 4;        /* M
45d0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
45e0: 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20   is 4 */.    }. 
45f0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
4600: 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65  = nSize;.  }else
4610: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
4620: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
4630: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
4640: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
4650: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
4660: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
4670: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
4680: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
4690: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
46a0: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
46b0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
46c0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
46d0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
46e0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
46f0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
4700: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
4710: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
4720: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
4730: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
4740: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
4750: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
4760: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
4770: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
4780: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
4790: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
47a0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
47b0: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
47c0: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
47d0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
47e0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
47f0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
4800: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
4810: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
4820: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
4830: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
4840: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
4850: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
4860: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
4870: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
4880: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
4890: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
48a0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
48b0: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
48c0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
48d0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
48e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
48f0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
4900: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
4910: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
4920: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
4930: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
4940: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
4950: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
4960: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
4970: 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20 20 20   = surplus;.    
4980: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
4990: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e  fo->nLocal = min
49a0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
49b0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
49c0: 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  w = pInfo->nLoca
49d0: 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f  l + n;.    pInfo
49e0: 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d  ->nSize = pInfo-
49f0: 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a  >iOverflow + 4;.
4a00: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61    }.}.#define pa
4a10: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
4a20: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20  Cell, pInfo) \. 
4a30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4a40: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
4a50: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
4a60: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
4a70: 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c  pInfo)).void sql
4a80: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4a90: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
4aa0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
4ab0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
4ac0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
4ad0: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
4ae0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
4af0: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
4b00: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
4b10: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
4b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
4b30: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
4b40: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
4b50: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4b60: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
4b70: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
4b80: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
4b90: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
4ba0: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
4bb0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
4bc0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
4bd0: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
4be0: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
4bf0: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
4c00: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
4c10: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
4c20: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
4c30: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
4c40: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
4c50: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
4c60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
4c70: 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20 63  BUG.static u16 c
4c80: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
4c90: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
4ca0: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
4cb0: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nfo;.  sqlite3Bt
4cc0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 50 61  reeParseCell(pPa
4cd0: 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, iCell, &info
4ce0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
4cf0: 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66  .nSize;.}.#endif
4d00: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
4d10: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
4d20: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
4d30: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
4d40: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nfo;.  sqlite3Bt
4d50: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
4d60: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
4d70: 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nfo);.  return i
4d80: 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69  nfo.nSize;.}..#i
4d90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4da0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
4db0: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
4dc0: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
4dd0: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
4de0: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
4df0: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
4e00: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
4e10: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
4e20: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
4e30: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
4e40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4e50: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
4e60: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
4e70: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
4e80: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
4e90: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
4ea0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  0 );.  sqlite3Bt
4eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
4ec0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
4ed0: 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
4ee0: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
4ef0: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
4f00: 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
4f10: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28  Payload );.  if(
4f20: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
4f30: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
4f40: 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
4f50: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e  Local ){.    Pgn
4f60: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
4f70: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
4f80: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72  verflow]);.    r
4f90: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28  eturn ptrmapPut(
4fa0: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
4fb0: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
4fc0: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
4fd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
4fe0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
4ff0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69  * If the cell wi
5000: 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f  th index iCell o
5010: 6e 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  n page pPage con
5020: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
5030: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
5040: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
5050: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
5060: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
5070: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
5080: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
5090: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
50a0: 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  fl(MemPage *pPag
50b0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
50c0: 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73   u8 *pCell;.  as
50d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
50e0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
50f0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5100: 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65   pCell = findOve
5110: 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
5120: 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72   iCell);.  retur
5130: 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
5140: 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
5150: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
5160: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
5170: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
5180: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
5190: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
51a0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
51b0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
51c0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
51d0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
51e0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
51f0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
5200: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
5210: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
5220: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
5230: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
5240: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
5250: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
5260: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
5270: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5280: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5290: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
52a0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
52b0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
52c0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
52d0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
5300: 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20 63  rst byte after c
5310: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
5320: 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  y */.  int hdr; 
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
5350: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
5360: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5380: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
5390: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
53a0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
53b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
53c0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
53d0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
53e0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
53f0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
5400: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
5410: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
5420: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
5430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
5440: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
5450: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
5460: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5480: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
5490: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
54a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
54b0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
54c0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
54d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
54e0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
54f0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
5500: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  l content */..  
5510: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5520: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5530: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5540: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
5550: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5560: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
5570: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c  Bt->usableSize <
5580: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
5590: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65  E_SIZE );.  asse
55a0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
55b0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
55c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
55d0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
55e0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
55f0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
5600: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
5610: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
5620: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
5630: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
5640: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
5650: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
5660: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
5670: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
5680: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
5690: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
56a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
56b0: 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  +3]) );.  usable
56c0: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
56d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
56e0: 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65   cbrk = get2byte
56f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
5700: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63    memcpy(&temp[c
5710: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b  brk], &data[cbrk
5720: 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
5730: 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20  cbrk);.  cbrk = 
5740: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f  usableSize;.  fo
5750: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
5760: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
5770: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
5780: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
5790: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
57a0: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
57b0: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
57c0: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
57d0: 72 29 3b 0a 20 20 20 20 69 66 20 28 70 63 20 3e  r);.    if (pc >
57e0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
57f0: 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20 20  ableSize) {.    
5800: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5810: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
5820: 20 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63    }.    size = c
5830: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
5840: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
5850: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
5860: 20 20 20 20 69 66 20 28 28 63 62 72 6b 20 3c 20      if ((cbrk < 
5870: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
5880: 6c 6c 29 20 7c 7c 20 28 63 62 72 6b 2b 73 69 7a  ll) || (cbrk+siz
5890: 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  e>pPage->pBt->us
58a0: 61 62 6c 65 53 69 7a 65 29 29 20 7b 0a 20 20 20  ableSize)) {.   
58b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
58c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
58d0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
58e0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
58f0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
5900: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
5910: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
5920: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63 65  assert( cbrk>=ce
5930: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
5940: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
5950: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
5960: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
5970: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
5980: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
5990: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61  [hdr+7] = 0;.  a
59a0: 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ddr = cellOffset
59b0: 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73  +2*nCell;.  mems
59c0: 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  et(&data[addr], 
59d0: 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a 20  0, cbrk-addr);. 
59e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
59f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
5a00: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
5a10: 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20 70   of space on a p
5a20: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  age..**.** Retur
5a30: 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  n the index into
5a40: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
5a50: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
5a60: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  e of.** the new 
5a70: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65  allocation.  The
5a80: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
5a90: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
5aa0: 20 65 6e 6f 75 67 68 0a 2a 2a 20 73 70 61 63 65   enough.** space
5ab0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
5ac0: 77 69 6c 6c 20 6e 65 76 65 72 20 66 61 69 6c 2e  will never fail.
5ad0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
5ae0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74  ge contains nByt
5af0: 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  es of free space
5b00: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f   but does not co
5b10: 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20  ntain.** nBytes 
5b20: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66 72  of contiguous fr
5b30: 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20 74  ee space, then t
5b40: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74 6f  his routine auto
5b50: 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c  matically.** cal
5b60: 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50 61  ls defragementPa
5b70: 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64  ge() to consolid
5b80: 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70 61  ate all free spa
5b90: 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c  ce before .** al
5ba0: 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65 77  locating the new
5bb0: 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69   chunk..*/.stati
5bc0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
5bd0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
5be0: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  ge, int nByte){.
5bf0: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c 20    int addr, pc, 
5c00: 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  hdr;.  int size;
5c10: 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20  .  int nFrag;.  
5c20: 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e  int top;.  int n
5c30: 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c  Cell;.  int cell
5c40: 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e  Offset;.  unsign
5c50: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
5c60: 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65   .  data = pPage
5c70: 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72  ->aData;.  asser
5c80: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
5c90: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
5ca0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
5cb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
5cc0: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
5cd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5ce0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
5cf0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
5d00: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
5d10: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
5d20: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
5d30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
5d40: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
5d50: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
5d60: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
5d70: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
5d80: 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20   nByte;.  hdr = 
5d90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
5da0: 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74  ;..  nFrag = dat
5db0: 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20  a[hdr+7];.  if( 
5dc0: 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20  nFrag<60 ){.    
5dd0: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
5de0: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
5df0: 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e  or a slot big en
5e00: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
5e10: 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  the.    ** space
5e20: 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20   request. */.   
5e30: 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20   addr = hdr+1;. 
5e40: 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20     while( (pc = 
5e50: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
5e60: 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20  ddr]))>0 ){.    
5e70: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
5e80: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
5e90: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
5ea0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
5eb0: 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b   if( size<nByte+
5ec0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  4 ){.          m
5ed0: 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72  emcpy(&data[addr
5ee0: 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29  ], &data[pc], 2)
5ef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  ;.          data
5f00: 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20  [hdr+7] = nFrag 
5f10: 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  + size - nByte;.
5f20: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5f30: 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   pc;.        }el
5f40: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75  se{.          pu
5f50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
5f60: 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b  2], size-nByte);
5f70: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5f80: 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42  n pc + size - nB
5f90: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  yte;.        }. 
5fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64       }.      add
5fb0: 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20  r = pc;.    }.  
5fc0: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
5fd0: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
5fe0: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
5ff0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
6000: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
6010: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6020: 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f   area..  */.  to
6030: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
6040: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43  ta[hdr+5]);.  nC
6050: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
6060: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
6070: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
6080: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
6090: 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20    if( nFrag>=60 
60a0: 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  || cellOffset + 
60b0: 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20  2*nCell > top - 
60c0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 64 65 66  nByte ){.    def
60d0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
60e0: 65 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  e);.    top = ge
60f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6100: 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20  +5]);.  }.  top 
6110: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  -= nByte;.  asse
6120: 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  rt( cellOffset +
6130: 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20   2*nCell <= top 
6140: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
6150: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
6160: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
6170: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6180: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
6190: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
61a0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
61b0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
61c0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
61d0: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
61e0: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
61f0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
6200: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
6210: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
6220: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
6230: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
6240: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
6250: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
6260: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
6270: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
6280: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
6290: 69 63 20 76 6f 69 64 20 66 72 65 65 53 70 61 63  ic void freeSpac
62a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
62b0: 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74  , int start, int
62c0: 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64   size){.  int ad
62d0: 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b  dr, pbegin, hdr;
62e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
62f0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
6300: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
6310: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
6320: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
6330: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
6340: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
6350: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
6360: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
6370: 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61  hdrOffset+6+(pPa
6380: 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b  ge->leaf?0:4) );
6390: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
63a0: 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65  t + size)<=pPage
63b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
63c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
63d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
63e0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
63f0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
6400: 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f  ( size>=0 );   /
6410: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
6420: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66  ize is 4 */..#if
6430: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
6440: 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76  E_DELETE.  /* Ov
6450: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
6460: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
6470: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
6480: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20  SECURE_DELETE . 
6490: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
64a0: 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
64b0: 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  -time */.  memse
64c0: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
64d0: 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66  0, size);.#endif
64e0: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
64f0: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
6500: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
6510: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a  f freeblocks */.
6520: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
6530: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
6540: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
6550: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
6560: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
6570: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
6580: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61  begin>0 ){.    a
6590: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
65a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
65b0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61  eSize-4 );.    a
65c0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
65d0: 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  dr );.    addr =
65e0: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61   pbegin;.  }.  a
65f0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6600: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6610: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73  eSize-4 );.  ass
6620: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
6630: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
6640: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6650: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
6660: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
6670: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
6680: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
6690: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
66a0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
66b0: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20  ree += size;..  
66c0: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
66d0: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
66e0: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
66f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
6700: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
6710: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
6720: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
6730: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
6740: 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65   psize;.    asse
6750: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
6760: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
6770: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
6780: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
6790: 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67  );.    pnext = g
67a0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
67b0: 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a  egin]);.    psiz
67c0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
67d0: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
67e0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20     if( pbegin + 
67f0: 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65  psize + 3 >= pne
6800: 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b  xt && pnext>0 ){
6810: 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20  .      int frag 
6820: 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69  = pnext - (pbegi
6830: 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  n+psize);.      
6840: 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61  assert( frag<=da
6850: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
6860: 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20  set+7] );.      
6870: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
6880: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67  ffset+7] -= frag
6890: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
68a0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
68b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
68c0: 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70  next]));.      p
68d0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
68e0: 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67  egin+2], pnext+g
68f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
6900: 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b  ext+2])-pbegin);
6910: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6920: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
6930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6940: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
6950: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
6960: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
6970: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
6980: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
6990: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
69a0: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
69b0: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
69c0: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
69d0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
69e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
69f0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
6a00: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
6a10: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
6a20: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
6a30: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
6a40: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
6a50: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20  a[hdr+5], top + 
6a60: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6a70: 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a  begin+2]));.  }.
6a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
6a90: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
6aa0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
6ab0: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
6ac0: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
6ad0: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
6ae0: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
6af0: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
6b00: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
6b10: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
6b20: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
6b30: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
6b40: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
6b50: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
6b60: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6b70: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
6b80: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
6b90: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
6ba0: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
6bb0: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
6bc0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
6bd0: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
6be0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
6bf0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
6c00: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
6c10: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
6c20: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
6c30: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
6c40: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
6c50: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
6c60: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
6c70: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
6c80: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
6c90: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
6ca0: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
6cb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6cc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
6cd0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
6ce0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
6cf0: 3d 20 66 6c 61 67 42 79 74 65 3e 3e 33 3b 20 20  = flagByte>>3;  
6d00: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
6d10: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
6d20: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
6d30: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
6d40: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
6d50: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
6d60: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
6d70: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
6d80: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
6d90: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
6da0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
6db0: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
6dc0: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
6dd0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
6de0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
6df0: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
6e00: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
6e10: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
6e20: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
6e30: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
6e40: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
6e50: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
6e60: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
6e70: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
6e80: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
6e90: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
6ea0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
6eb0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
6ec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6ee0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
6ef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
6f10: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
6f20: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
6f30: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
6f40: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
6f50: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
6f60: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
6f70: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
6f80: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
6f90: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
6fa0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
6fb0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
6fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
6fd0: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
6fe0: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
6ff0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
7000: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
7010: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
7020: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
7030: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
7040: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
7050: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
7060: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
7070: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
7080: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
7090: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
70a0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
70b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
70c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
70d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
70e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
70f0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
7100: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
7110: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
7120: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
7130: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
7140: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
7150: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7160: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
7170: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7180: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
7190: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
71a0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
71b0: 0a 20 20 20 20 69 6e 74 20 70 63 3b 20 20 20 20  .    int pc;    
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
71d0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
71e0: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
71f0: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 69  aData[] */.    i
7200: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
7210: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
7220: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
7230: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
7240: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
7250: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
7260: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
7270: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
7280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
7290: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
72a0: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
72b0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
72c0: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
72d0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
72e0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  page */.    int 
72f0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
7300: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
7310: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
7320: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
7330: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
7340: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
7350: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
7360: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
7370: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
7380: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7390: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
73a0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
73b0: 65 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d  ea */..    pBt =
73c0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
73d0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
73e0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61  drOffset;.    da
73f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7400: 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64  a;.    if( decod
7410: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
7420: 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72  ta[hdr]) ) retur
7430: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7440: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
7450: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
7460: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
7470: 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b  geSize<=32768 );
7480: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  .    pPage->mask
7490: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Page = pBt->page
74a0: 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50  Size - 1;.    pP
74b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
74c0: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
74d0: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
74e0: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
74f0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
7500: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
7510: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
7520: 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  eaf;.    top = g
7530: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
7540: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65  r+5]);.    pPage
7550: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
7560: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
7570: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
7580: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
7590: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
75a0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
75b0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
75c0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
75d0: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
75e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
75f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7600: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
7610: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
7620: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
7630: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
7640: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
7650: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
7660: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
7670: 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65  r+7] + top - (ce
7680: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
7690: 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
76a0: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
76b0: 20 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20 73       int next, s
76c0: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
76d0: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  c>usableSize-4 )
76e0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
76f0: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
7700: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
7710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7720: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
7730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
7740: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
7750: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
7760: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
7770: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
7780: 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26      if( next>0 &
7790: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
77a0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  3 ){.        /* 
77b0: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
77c0: 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   be in accending
77d0: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
77e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
77f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
7800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
7810: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ee += size;.    
7820: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
7830: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46   }.    pPage->nF
7840: 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 20  ree = nFree;.   
7850: 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62   if( nFree>=usab
7860: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
7870: 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63 61  /* Free space ca
7880: 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61  nnot exceed tota
7890: 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  l page size */. 
78a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
78b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
78c0: 20 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20   .    }..#if 0. 
78d0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61   /* Check that a
78e0: 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20 69  ll the offsets i
78f0: 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65  n the cell offse
7900: 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74 68  t array are with
7910: 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20  in range. .  ** 
7920: 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74  .  ** Omitting t
7930: 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  his consistency 
7940: 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20  check and using 
7950: 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  the pPage->maskP
7960: 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f  age mask.  ** to
7970: 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e   prevent overrun
7980: 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62 75  ning the page bu
7990: 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c  ffer in findCell
79a0: 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a  () results in a.
79b0: 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72    ** 2.5% perfor
79c0: 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f  mance gain..  */
79d0: 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66  .  {.    u8 *pOf
79e0: 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65  f;        /* Ite
79f0: 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68  rator used to ch
7a00: 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66  eck all cell off
7a10: 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67  sets are in rang
7a20: 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e  e */.    u8 *pEn
7a30: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  d;        /* Poi
7a40: 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63  nter to end of c
7a50: 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79  ell offset array
7a60: 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b   */.    u8 mask;
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
7a80: 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d 75   of bits that mu
7a90: 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53  st be zero in MS
7aa0: 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  B of cell offset
7ab0: 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20  s */.    mask = 
7ac0: 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67  ~(((u8)(pBt->pag
7ad0: 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20  eSize>>8))-1);. 
7ae0: 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b     pEnd = &data[
7af0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61  cellOffset + pPa
7b00: 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  ge->nCell*2];.  
7b10: 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61    for(pOff=&data
7b20: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f  [cellOffset]; pO
7b30: 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a  ff!=pEnd && !((*
7b40: 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66  pOff)&mask); pOf
7b50: 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70  f+=2);.    if( p
7b60: 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20  Off!=pEnd ){.   
7b70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7b80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7b90: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
7ba0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
7bb0: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
7bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
7be0: 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
7bf0: 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
7c00: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
7c10: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
7c20: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
7c30: 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
7c40: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7c50: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
7c60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
7c70: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
7c80: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
7c90: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
7ca0: 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67    int hdr = pPag
7cb0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
7cc0: 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  int first;..  as
7cd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7ce0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
7cf0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
7d00: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
7d10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7d20: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
7d30: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
7d40: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
7d50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7d60: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
7d70: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7d80: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
7d90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
7da0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
7db0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
7dc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7dd0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7de0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d  utex) );.  /*mem
7df0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
7e00: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
7e10: 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64  ze - hdr);*/.  d
7e20: 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73  ata[hdr] = flags
7e30: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
7e40: 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26  + 8 + 4*((flags&
7e50: 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20  PTF_LEAF)==0);. 
7e60: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
7e70: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
7e80: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
7e90: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
7ea0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
7eb0: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
7ec0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
7ed0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
7ee0: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
7ef0: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
7f00: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
7f10: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
7f20: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
7f30: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
7f40: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
7f50: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7f60: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
7f70: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
7f80: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
7f90: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
7fa0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
7fb0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
7fc0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
7fd0: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
7fe0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
7ff0: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
8000: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
8010: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
8020: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
8030: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
8040: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
8050: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
8060: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
8070: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
8080: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
8090: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
80a0: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
80b0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
80c0: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
80d0: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
80e0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
80f0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
8100: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
8110: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
8120: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
8130: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
8140: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
8150: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
8160: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
8170: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
8180: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
8190: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
81a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
81b0: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
81c0: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
81d0: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
81e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
81f0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
8200: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
8210: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
8220: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
8230: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
8240: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
8250: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
8260: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
8270: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
8280: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
8290: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
82a0: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
82b0: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
82c0: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
82d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
82e0: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
82f0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
8300: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
8310: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
8320: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
8330: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
8340: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
8350: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
8360: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
8370: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
8380: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
8390: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
83a0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
83b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
83c0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
83d0: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
83e0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
83f0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
8400: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
8410: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
8420: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
8430: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
8440: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
8450: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
8460: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
8470: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
8480: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8490: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
84a0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
84b0: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
84c0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
84d0: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
84e0: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
84f0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
8500: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
8510: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
8520: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
8530: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
8540: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8550: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
8560: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
8570: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8580: 20 69 6e 20 70 61 67 65 73 2e 20 20 4f 72 20 72   in pages.  Or r
8590: 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 74  eturn -1 if.** t
85a0: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
85b0: 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   of error..*/.st
85c0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
85d0: 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
85e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
85f0: 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20  ;.  int nPage;. 
8600: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8610: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
8620: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 72  er, &nPage);.  r
8630: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
8640: 45 5f 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a  E_OK?nPage:-1);.
8650: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
8660: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
8670: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
8680: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
8690: 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61  ine.** is just a
86a0: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
86b0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
86c0: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  rate calls to.**
86d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
86e0: 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74  Page() and sqlit
86f0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
8700: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
8710: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
8720: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
8730: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
8740: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
8750: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
8760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8770: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
8780: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
8790: 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20  age **ppPage    
87a0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
87b0: 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
87c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
87d0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
87e0: 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e;.  MemPage *pP
87f0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
8800: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8810: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
8820: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
8830: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8840: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8850: 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  T; .  }..  /* It
8860: 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63 61   is often the ca
8870: 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  se that the page
8880: 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72 65   we want is alre
8890: 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20 20  ady in cache..  
88a0: 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69 74  ** If so, get it
88b0: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
88c0: 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20 68   saves us from h
88d0: 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20 20  aving to call.  
88e0: 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  ** pagerPagecoun
88f0: 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  t() to make sure
8900: 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e 20   pgno is within 
8910: 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72 65  limits, which re
8920: 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20  sults.  ** in a 
8930: 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72 66  measureable perf
8940: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
8950: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 44 62  ents..  */.  pDb
8960: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
8970: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
8980: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
8990: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
89a0: 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c     /* Page is al
89b0: 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a  ready in cache *
89c0: 2f 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  /.    *ppPage = 
89d0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
89e0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
89f0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
8a00: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8a10: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
8a20: 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e    /* Page not in
8a30: 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65   cache.  Acquire
8a40: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
8a50: 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
8a60: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
8a70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8a80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8a90: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
8aa0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8ab0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
8ac0: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
8ad0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
8ae0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
8af0: 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  ge = *ppPage;.  
8b00: 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  }.  if( !pPage->
8b10: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  isInit ){.    rc
8b20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
8b30: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
8b40: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
8b50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
8b60: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
8b70: 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  );.    *ppPage =
8b80: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
8b90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
8ba0: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
8bb0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
8bc0: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
8bd0: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
8be0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
8bf0: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
8c00: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
8c10: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
8c20: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
8c30: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
8c40: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
8c50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
8c60: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
8c70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8c80: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
8c90: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
8ca0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
8cb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
8cc0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8cd0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
8ce0: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
8cf0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
8d00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8d10: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8d20: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
8d30: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
8d40: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
8d50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
8d60: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
8d70: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
8d80: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
8d90: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
8da0: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
8db0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
8dc0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
8dd0: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
8de0: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
8df0: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
8e00: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
8e10: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
8e20: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
8e30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
8e40: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
8e50: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
8e60: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
8e70: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
8e80: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
8e90: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
8ea0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8eb0: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
8ec0: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
8ed0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
8ee0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
8ef0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
8f00: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66  tra(pData);.  if
8f10: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
8f20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
8f30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8f40: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8f50: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
8f60: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
8f70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
8f80: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
8f90: 70 44 61 74 61 29 3e 30 20 29 7b 0a 20 20 20 20  pData)>0 ){.    
8fa0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
8fb0: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
8fc0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8fd0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
8fe0: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
8ff0: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
9000: 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65   int sqlite3Btre
9010: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
9020: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  er(void *pArg, i
9030: 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61 72 65  nt n){.  BtShare
9040: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
9050: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
9060: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
9070: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9080: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
9090: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
90a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
90b0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
90c0: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
90d0: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
90e0: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
90f0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
9100: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
9110: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
9120: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
9130: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
9140: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
9150: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
9160: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
9170: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
9180: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
9190: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
91a0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
91b0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
91c0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
91d0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
91e0: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
91f0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9200: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
9210: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
9220: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
9230: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
9240: 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
9250: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
9260: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
9270: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
9280: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
9290: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
92a0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
92b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
92c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
92d0: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
92e0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
92f0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
9300: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
9310: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
9320: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
9330: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
9340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9350: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
9360: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
9370: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
9380: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
9390: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
93a0: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
93b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
93c0: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f     /* The VFS to
93d0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74   use for this bt
93e0: 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ree */.  BtShare
93f0: 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
9400: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
9410: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
9420: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
9430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9440: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
9450: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
9460: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
9470: 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75  nt nReserve;.  u
9480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
9490: 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20  Header[100];..  
94a0: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
94b0: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
94c0: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
94d0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
94e0: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
94f0: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
9500: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
9510: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
9520: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
9530: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
9540: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
9550: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
9560: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
9570: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
9580: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
9590: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
95a0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
95b0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
95c0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
95d0: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
95e0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
95f0: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
9600: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
9610: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
9620: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
9630: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
9640: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
9650: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
9660: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
9670: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
9680: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9690: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
96a0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
96b0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
96c0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
96d0: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
96e0: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
96f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9700: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
9710: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
9720: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
9730: 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66   = db;..#if !def
9740: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9750: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
9760: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9770: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
9780: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
9790: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
97a0: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
97b0: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
97c0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
97d0: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
97e0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
97f0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
9800: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
9810: 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61  0.   && (db->fla
9820: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
9830: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
9840: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
9850: 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66  e[0].  ){.    if
9860: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
9870: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
9880: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
9890: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
98a0: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
98b0: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
98c0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
98d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
98e0: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
98f0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
9900: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
9910: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73  ared;.      p->s
9920: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
9930: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
9940: 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63  SQLITE_SharedCac
9950: 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  he;.      if( !z
9960: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
9970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9980: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
9990: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
99a0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
99b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
99c0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
99d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
99e0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
99f0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
9a00: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
9a10: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
9a20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
9a30: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
9a40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9a50: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
9a60: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
9a70: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
9a80: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
9a90: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
9aa0: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
9ab0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9ac0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
9ad0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
9ae0: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
9af0: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
9b00: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
9b10: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
9b20: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
9b30: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
9b40: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
9b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
9b60: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
9b70: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
9b80: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
9b90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
9ba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9bb0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9bc0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
9bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9be0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
9bf0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
9c00: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
9c10: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
9c20: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
9c30: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
9c40: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
9c50: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
9c60: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
9c70: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
9c80: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
9c90: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
9ca0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
9cb0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
9cc0: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
9cd0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
9ce0: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
9cf0: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
9d00: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
9d10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
9d20: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
9d30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
9d40: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
9d50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
9d60: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
9d70: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
9d80: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
9d90: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
9da0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
9db0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
9dc0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
9dd0: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
9de0: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
9df0: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
9e00: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
9e10: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
9e20: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
9e30: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9e40: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
9e50: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
9e60: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9e70: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
9e80: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
9e90: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
9ea0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
9eb0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
9ec0: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
9ed0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
9ee0: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
9ef0: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
9f00: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
9f10: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
9f20: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
9f30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
9f40: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
9f50: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
9f60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
9f70: 62 75 73 79 48 64 72 2e 78 46 75 6e 63 20 3d 20  busyHdr.xFunc = 
9f80: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f  sqlite3BtreeInvo
9f90: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  keBusyHandler;. 
9fa0: 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64 72 2e     pBt->busyHdr.
9fb0: 70 41 72 67 20 3d 20 70 42 74 3b 0a 20 20 20 20  pArg = pBt;.    
9fc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
9fd0: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
9fe0: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
9ff0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
a010: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
a020: 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20  , vfsFlags);.   
a030: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a040: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
a050: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
a060: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
a070: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
a080: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
a090: 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
a0a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a0b0: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
a0c0: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
a0d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a0e0: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
a0f0: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
a100: 2c 20 26 70 42 74 2d 3e 62 75 73 79 48 64 72 29  , &pBt->busyHdr)
a110: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
a120: 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74  Bt;.  .    sqlit
a130: 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
a140: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
a150: 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
a160: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
a170: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
a180: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
a190: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69  >readOnly = sqli
a1a0: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
a1b0: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ly(pBt->pPager);
a1c0: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
a1d0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
a1e0: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
a1f0: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
a200: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
a210: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
a220: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
a230: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
a240: 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
a250: 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
a260: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
a270: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  geSize = 0;.    
a280: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
a290: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
a2a0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
a2b0: 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64 65 66 20  eSize);.#ifndef 
a2c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
a2d0: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
a2e0: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
a2f0: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
a300: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
a310: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
a320: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
a330: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
a340: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
a350: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
a360: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
a370: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
a380: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
a390: 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
a3a0: 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
a3b0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
a3c0: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
a3d0: 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
a3e0: 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
a3f0: 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
a400: 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
a410: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
a420: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
a430: 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
a440: 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
a450: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
a460: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
a470: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
a480: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
a490: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
a4a0: 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
a4b0: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
a4c0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
a4d0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
a4e0: 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
a4f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
a500: 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
a510: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
a520: 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  {.      nReserve
a530: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
a540: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
a550: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
a560: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a570: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
a580: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
a590: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
a5a0: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
a5b0: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
a5c0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
a5d0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
a5e0: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
a5f0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
a600: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  f.    }.    pBt-
a610: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
a620: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
a630: 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
a640: 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
a650: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
a660: 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
a670: 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
a680: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
a690: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
a6a0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
a6b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a  >pageSize);.   .
a6c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a6d0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
a6e0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
a6f0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
a700: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
a710: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
a720: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
a730: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
a740: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
a750: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
a760: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
a770: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
a780: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
a790: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
a7a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65   = 1;.      mute
a7b0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
a7c0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a7d0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a7e0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69  MASTER);.      i
a7f0: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
a800: 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
a810: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
a820: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
a830: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
a840: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
a850: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
a860: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
a870: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
a880: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
a890: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a8a0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
a8b0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
a8c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
a8d0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
a8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a8f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a900: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
a910: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
a920: 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
a930: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
a940: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a950: 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
a960: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
a970: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a980: 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
a990: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a9a0: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
a9b0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
a9c0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
a9d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a9e0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
a9f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
aa00: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
aa10: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
aa20: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
aa30: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
aa40: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
aa50: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
aa60: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
aa70: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
aa80: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
aa90: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
aaa0: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
aab0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
aac0: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
aad0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
aae0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
aaf0: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
ab00: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
ab10: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
ab20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
ab30: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
ab40: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
ab50: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
ab60: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
ab70: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
ab80: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
ab90: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
aba0: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
abb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
abc0: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
abd0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
abe0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
abf0: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
ac00: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ac10: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
ac20: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
ac30: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
ac40: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
ac50: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
ac60: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
ac70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ac80: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
ac90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
aca0: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
acb0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
acc0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
acd0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
ace0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
acf0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ad00: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
ad10: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
ad20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ad30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ad40: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
ad50: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
ad60: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
ad70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ad80: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
ad90: 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
ada0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
adb0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
adc0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
add0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
ade0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
adf0: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
ae00: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ee = 0;.  }.  re
ae10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ae20: 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
ae30: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
ae40: 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
ae50: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
ae60: 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
ae70: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
ae80: 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
ae90: 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
aea0: 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
aeb0: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
aec0: 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
aed0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
aee0: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
aef0: 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
af00: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
af10: 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
af20: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
af30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
af40: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
af50: 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  E.  sqlite3_mute
af60: 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74  x *pMaster;.  Bt
af70: 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
af80: 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
af90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
afa0: 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
afb0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
afc0: 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71  ;.  pMaster = sq
afd0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
afe0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
aff0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
b000: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b010: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
b020: 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
b030: 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
b040: 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
b050: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
b060: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
b070: 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
b080: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
b090: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
b0a0: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
b0b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
b0c0: 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
b0d0: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
b0e0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
b0f0: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
b100: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
b110: 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
b120: 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
b130: 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
b140: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
b150: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
b160: 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
b170: 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
b180: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
b190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b1a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
b1b0: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
b1c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
b1d0: 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
b1e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
b1f0: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
b200: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
b210: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
b220: 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
b230: 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
b240: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
b250: 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
b260: 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
b270: 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
b280: 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
b290: 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
b2a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b2b0: 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
b2c0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
b2d0: 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
b2e0: 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
b2f0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
b300: 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
b310: 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
b320: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
b330: 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
b340: 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
b350: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
b360: 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
b370: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
b380: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
b390: 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ee( pBt->pTmpSpa
b3a0: 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70  ce);.  pBt->pTmp
b3b0: 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Space = 0;.}../*
b3c0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
b3d0: 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
b3e0: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
b3f0: 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
b400: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
b410: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
b420: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
b430: 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
b440: 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
b450: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
b460: 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
b470: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
b480: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b490: 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
b4a0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
b4b0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
b4c0: 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
b4d0: 64 62 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  db;.  pCur = pBt
b4e0: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
b4f0: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
b500: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
b510: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
b520: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
b530: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
b540: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
b550: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
b560: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
b570: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
b580: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
b590: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
b5a0: 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
b5b0: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
b5c0: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
b5d0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
b5e0: 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
b5f0: 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
b600: 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
b610: 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
b620: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
b630: 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  k(p);.  sqlite3B
b640: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
b650: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
b660: 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
b670: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
b680: 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
b690: 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
b6a0: 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
b6b0: 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
b6c0: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
b6d0: 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
b6e0: 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
b6f0: 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
b700: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
b710: 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
b720: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
b730: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
b740: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
b750: 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
b760: 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
b770: 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
b780: 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
b790: 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
b7a0: 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
b7b0: 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
b7c0: 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
b7d0: 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
b7e0: 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
b7f0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
b800: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
b810: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
b820: 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
b830: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
b840: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
b850: 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
b860: 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
b870: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
b880: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
b890: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
b8a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
b8b0: 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ree(pBt->pSchema
b8c0: 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
b8d0: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
b8e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
b8f0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
b900: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
b910: 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
b920: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
b930: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b940: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
b950: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
b960: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
b970: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
b980: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
b990: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
b9a0: 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
b9b0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
b9c0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
b9d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b9e0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
b9f0: 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
ba00: 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
ba10: 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
ba20: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
ba30: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
ba40: 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
ba50: 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
ba60: 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
ba70: 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
ba80: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
ba90: 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
baa0: 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
bab0: 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
bac0: 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
bad0: 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
bae0: 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
baf0: 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
bb00: 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
bb10: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
bb20: 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
bb30: 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
bb40: 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
bb50: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
bb60: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
bb70: 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
bb80: 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
bb90: 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
bba0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
bbb0: 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
bbc0: 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
bbd0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
bbe0: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
bbf0: 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
bc00: 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
bc10: 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
bc20: 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
bc30: 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
bc40: 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
bc50: 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
bc60: 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
bc70: 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
bc80: 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
bc90: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
bca0: 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
bcb0: 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
bcc0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
bcd0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
bce0: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
bcf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
bd00: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
bd10: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bd20: 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
bd30: 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
bd40: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
bd50: 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
bd60: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
bd70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
bd80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bd90: 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
bda0: 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
bdb0: 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
bdc0: 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
bdd0: 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
bde0: 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
bdf0: 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
be00: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
be10: 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
be20: 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
be30: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
be40: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
be50: 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
be60: 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
be70: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
be80: 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
be90: 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
bea0: 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
beb0: 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
bec0: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
bed0: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
bee0: 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
bef0: 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
bf00: 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
bf10: 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
bf20: 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
bf30: 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
bf40: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
bf50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
bf60: 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
bf70: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
bf80: 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
bf90: 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
bfa0: 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
bfb0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
bfc0: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
bfd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
bfe0: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
bff0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
c000: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
c010: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
c020: 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
c030: 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
c040: 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
c050: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c060: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c070: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
c080: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
c090: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
c0a0: 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
c0b0: 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
c0c0: 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
c0d0: 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
c0e0: 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
c0f0: 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
c100: 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
c110: 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
c120: 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
c130: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
c140: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
c150: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
c160: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
c170: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
c180: 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
c190: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
c1a0: 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
c1b0: 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
c1c0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
c1d0: 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
c1e0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
c1f0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c200: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
c210: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c220: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
c230: 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
c240: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
c250: 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  UM)./*.** Change
c260: 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
c270: 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
c280: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
c290: 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
c2a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
c2b0: 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
c2c0: 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
c2d0: 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
c2e0: 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
c2f0: 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
c300: 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
c310: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
c320: 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
c330: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
c340: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
c350: 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
c360: 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
c370: 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
c380: 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
c390: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
c3a0: 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
c3b0: 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
c3c0: 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
c3d0: 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
c3e0: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
c3f0: 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
c400: 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
c410: 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
c420: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
c430: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
c440: 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
c450: 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
c460: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
c470: 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
c480: 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
c490: 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
c4a0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
c4b0: 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
c4c0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
c4d0: 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
c4e0: 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
c4f0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c500: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
c510: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
c520: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c530: 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
c540: 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
c550: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
c560: 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
c570: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
c580: 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
c590: 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
c5a0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
c5b0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
c5c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
c5d0: 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  }.  if( pageSize
c5e0: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
c5f0: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
c600: 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
c610: 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
c620: 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
c630: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
c640: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
c650: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
c660: 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70  Bt->pPage1 && !p
c670: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
c680: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
c690: 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
c6a0: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
c6b0: 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  Bt);.    rc = sq
c6c0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
c6d0: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
c6e0: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
c6f0: 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75  e);.  }.  pBt->u
c700: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
c710: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
c720: 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  erve;.  sqlite3B
c730: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c740: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c750: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
c760: 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
c770: 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
c780: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
c790: 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
c7a0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
c7b0: 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
c7c0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
c7d0: 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72  eeGetReserve(Btr
c7e0: 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
c7f0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
c800: 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70  nter(p);.  n = p
c810: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
c820: 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
c830: 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  Size;.  sqlite3B
c840: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
c850: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
c860: 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
c870: 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
c880: 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
c890: 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
c8a0: 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
c8b0: 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
c8c0: 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
c8d0: 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
c8e0: 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
c8f0: 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
c900: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
c910: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
c920: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
c930: 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
c940: 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
c950: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
c960: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c970: 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
c980: 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
c990: 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
c9a0: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
c9b0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c9c0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
c9d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
c9e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c9f0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
ca00: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
ca10: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20  TE_OMIT_VACUUM) 
ca20: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
ca30: 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
ca40: 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
ca50: 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
ca60: 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
ca70: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
ca80: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
ca90: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
caa0: 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
cab0: 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
cac0: 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
cad0: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
cae0: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
caf0: 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
cb00: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
cb10: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
cb20: 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
cb30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cb40: 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
cb50: 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
cb60: 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
cb70: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
cb80: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
cb90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
cba0: 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
cbb0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
cbc0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
cbd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
cbe0: 74 20 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75  t av = (autoVacu
cbf0: 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69  um?1:0);..  sqli
cc00: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
cc10: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
cc20: 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 61 76  eSizeFixed && av
cc30: 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
cc40: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
cc50: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
cc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
cc70: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
cc80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
cc90: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
cca0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
ccb0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
ccc0: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
ccd0: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
cce0: 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
ccf0: 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
cd00: 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
cd10: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
cd20: 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
cd30: 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
cd40: 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
cd50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
cd60: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
cd70: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
cd80: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
cd90: 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
cda0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
cdb0: 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
cdc0: 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
cdd0: 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
cde0: 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
cdf0: 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
ce00: 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
ce10: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
ce20: 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
ce30: 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
ce40: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
ce50: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
ce60: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
ce70: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
ce80: 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
ce90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
cea0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
ceb0: 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
cec0: 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
ced0: 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
cee0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
cef0: 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
cf00: 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
cf10: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
cf20: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
cf30: 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
cf40: 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
cf50: 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
cf60: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
cf70: 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
cf80: 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
cf90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
cfa0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
cfb0: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
cfc0: 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
cfd0: 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
cfe0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
cff0: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
d000: 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
d010: 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  nPage;..  assert
d020: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d030: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d040: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   );.  if( pBt->p
d050: 50 61 67 65 31 20 29 20 72 65 74 75 72 6e 20 53  Page1 ) return S
d060: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d  QLITE_OK;.  rc =
d070: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
d080: 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
d090: 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
d0a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d0b0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
d0c0: 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
d0d0: 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
d0e0: 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
d0f0: 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
d100: 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
d110: 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
d120: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
d130: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
d140: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
d150: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d160: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
d170: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
d180: 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  iled;.  }else if
d190: 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
d1a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20   int pageSize;. 
d1b0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
d1c0: 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
d1d0: 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
d1e0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
d1f0: 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66  E_NOTADB;.    if
d200: 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
d210: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
d220: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
d230: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
d240: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
d250: 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
d260: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
d270: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
d280: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
d290: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
d2a0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d2b0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
d2c0: 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
d2d0: 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
d2e0: 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
d2f0: 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
d300: 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
d310: 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
d320: 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
d330: 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
d340: 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
d350: 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
d360: 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
d370: 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
d380: 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
d390: 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
d3a0: 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
d3b0: 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
d3c0: 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
d3d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
d3e0: 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
d3f0: 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
d400: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
d410: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
d420: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
d430: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
d440: 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a  te(&page1[16]);.
d450: 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
d460: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
d470: 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35  =0 || pageSize<5
d480: 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53  12 ||.        (S
d490: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
d4a0: 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67  IZE<32768 && pag
d4b0: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
d4c0: 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20  _PAGE_SIZE).    
d4d0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
d4e0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
d4f0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
d500: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
d510: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62  )==0 );.    usab
d520: 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
d530: 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
d540: 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21     if( pageSize!
d550: 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
d560: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
d570: 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
d580: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
d590: 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
d5a0: 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
d5b0: 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
d5c0: 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
d5d0: 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
d5e0: 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
d5f0: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
d600: 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
d610: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
d620: 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
d630: 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
d640: 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
d650: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
d660: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
d670: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
d680: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
d690: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
d6a0: 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
d6b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
d6c0: 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
d6d0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
d6e0: 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
d6f0: 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
d700: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
d710: 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
d720: 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
d730: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
d740: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
d750: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
d760: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
d770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d780: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
d790: 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20   usableSize<500 
d7a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
d7b0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
d7c0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
d7d0: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
d7e0: 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
d7f0: 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
d800: 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
d810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
d820: 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
d830: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
d840: 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
d850: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
d860: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
d870: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
d880: 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
d890: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
d8a0: 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
d8b0: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
d8c0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
d8d0: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
d8e0: 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
d8f0: 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
d900: 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
d910: 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
d920: 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
d930: 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
d940: 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
d950: 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
d960: 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
d970: 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
d980: 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
d990: 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
d9a0: 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
d9b0: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
d9c0: 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
d9d0: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
d9e0: 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
d9f0: 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
da00: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
da10: 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
da20: 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
da30: 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
da40: 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
da50: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
da60: 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68  byte poiner, a h
da70: 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
da80: 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
da90: 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
daa0: 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
dab0: 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
dac0: 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
dad0: 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
dae0: 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
daf0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
db00: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
db10: 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
db20: 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  3;.  pBt->minLoc
db30: 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
db40: 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
db50: 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61   - 23;.  pBt->ma
db60: 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61  xLeaf = pBt->usa
db70: 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20  bleSize - 35;.  
db80: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
db90: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
dba0: 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
dbb0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
dbc0: 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
dbd0: 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
dbe0: 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
dbf0: 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72  e1 = pPage1;.  r
dc00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dc10: 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
dc20: 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
dc30: 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
dc40: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
dc50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
dc60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
dc70: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63  e works like loc
dc80: 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20  kBtree() except 
dc90: 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76  that it also inv
dca0: 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79  okes the.** busy
dcb0: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
dcc0: 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
dcd0: 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntion..*/.static
dce0: 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69   int lockBtreeWi
dcf0: 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70  thRetry(Btree *p
dd00: 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Ref){.  int rc =
dd10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
dd20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
dd30: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52  reeHoldsMutex(pR
dd40: 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65  ef) );.  if( pRe
dd50: 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  f->inTrans==TRAN
dd60: 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38  S_NONE ){.    u8
dd70: 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d   inTransaction =
dd80: 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72   pRef->pBt->inTr
dd90: 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62  ansaction;.    b
dda0: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52  treeIntegrity(pR
ddb0: 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ef);.    rc = sq
ddc0: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
ddd0: 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20  rans(pRef, 0);. 
dde0: 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e     pRef->pBt->in
ddf0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e  Transaction = in
de00: 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
de10: 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d   pRef->inTrans =
de20: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
de30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
de40: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66  OK ){.      pRef
de50: 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ->pBt->nTransact
de60: 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ion--;.    }.   
de70: 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
de80: 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pRef);.  }.  ret
de90: 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20  urn rc;.}.      
dea0: 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72   ../*.** If ther
deb0: 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
dec0: 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
ded0: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
dee0: 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
def0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
df00: 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
df10: 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
df20: 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
df30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
df40: 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
df50: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
df60: 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
df70: 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
df80: 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
df90: 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
dfa0: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
dfb0: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
dfc0: 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f  cursors, this ro
dfd0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
dfe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
dff0: 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
e000: 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
e010: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
e020: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
e030: 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
e040: 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
e050: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
e060: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e070: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e080: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
e090: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
e0a0: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
e0b0: 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26  Bt->pCursor==0 &
e0c0: 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
e0d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
e0e0: 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
e0f0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31  (pBt->pPager)>=1
e100: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
e110: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
e120: 44 61 74 61 20 29 3b 0a 23 69 66 20 30 0a 20 20  Data );.#if 0.  
e130: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61      if( pBt->pPa
e140: 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b  ge1->aData==0 ){
e150: 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
e160: 20 2a 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70   *pPage = pBt->p
e170: 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70  Page1;.        p
e180: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
e190: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e1a0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e1b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
e1c0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
e1d0: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
e1e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 1;.      }.#e
e1f0: 6e 64 69 66 0a 20 20 20 20 20 20 72 65 6c 65 61  ndif.      relea
e200: 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67  sePage(pBt->pPag
e210: 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  e1);.    }.    p
e220: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
e230: 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20      pBt->inStmt 
e240: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
e250: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64  * Create a new d
e260: 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
e270: 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
e280: 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  t page of the.**
e290: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
e2a0: 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
e2b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
e2c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
e2d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
e2e0: 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
e2f0: 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a  ;.  int nPage;..
e300: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e310: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
e320: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
e330: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
e340: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
e350: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
e360: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e370: 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b  OK || nPage>0 ){
e380: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
e390: 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
e3a0: 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
e3b0: 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
e3c0: 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
e3d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e3e0: 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
e3f0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
e400: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
e410: 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
e420: 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
e430: 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
e440: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
e450: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
e460: 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32  r)==16 );.  put2
e470: 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20  byte(&data[16], 
e480: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
e490: 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
e4a0: 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
e4b0: 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74    data[20] = pBt
e4c0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
e4d0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
e4e0: 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
e4f0: 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
e500: 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
e510: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
e520: 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
e530: 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
e540: 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
e550: 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
e560: 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65  A );.  pBt->page
e570: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
e580: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e590: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
e5a0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
e5b0: 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
e5c0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
e5d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
e5e0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
e5f0: 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
e600: 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
e610: 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
e620: 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
e630: 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
e640: 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
e650: 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
e660: 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  uum);.#endif.  r
e670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
e690: 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
e6a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
e6b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e6c0: 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
e6d0: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
e6e0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
e6f0: 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
e700: 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
e710: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
e720: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
e730: 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
e740: 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
e750: 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
e760: 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
e770: 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
e780: 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
e790: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
e7a0: 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
e7b0: 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
e7c0: 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
e7d0: 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
e7e0: 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
e7f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
e800: 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
e810: 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
e820: 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
e830: 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
e840: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
e850: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e860: 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
e870: 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
e880: 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
e890: 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
e8a0: 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
e8b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
e8c0: 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
e8d0: 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
e8e0: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
e8f0: 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
e900: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e910: 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
e920: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e930: 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
e940: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
e950: 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
e960: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
e970: 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
e980: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
e990: 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
e9a0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e9b0: 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
e9c0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e9d0: 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
e9e0: 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
e9f0: 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
ea00: 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
ea10: 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
ea20: 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
ea30: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
ea40: 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
ea50: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
ea60: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
ea70: 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
ea80: 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
ea90: 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
eaa0: 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
eab0: 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
eac0: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
ead0: 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
eae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
eaf0: 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
eb00: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
eb10: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
eb20: 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
eb30: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
eb40: 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
eb50: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
eb60: 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
eb70: 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
eb80: 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
eb90: 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
eba0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
ebb0: 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
ebc0: 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
ebd0: 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
ebe0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
ebf0: 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
ec00: 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
ec10: 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
ec20: 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
ec30: 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
ec40: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
ec50: 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
ec60: 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
ec70: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
ec80: 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
ec90: 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
eca0: 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
ecb0: 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
ecc0: 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
ecd0: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
ece0: 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
ecf0: 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
ed00: 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
ed10: 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
ed20: 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
ed30: 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
ed40: 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
ed50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
ed60: 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
ed70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
ed80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ed90: 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
eda0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65   = p->db;.  btre
edb0: 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
edc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
edd0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
ede0: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
edf0: 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
ee00: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
ee10: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
ee20: 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
ee30: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
ee40: 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
ee50: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
ee60: 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
ee70: 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
ee80: 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
ee90: 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
eea0: 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
eeb0: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
eec0: 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
eed0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
eee0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
eef0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
ef00: 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42  base */.  if( pB
ef10: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
ef20: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
ef30: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
ef40: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
ef50: 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
ef60: 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
ef70: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
ef80: 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
ef90: 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
efa0: 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
efb0: 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
efc0: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
efd0: 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
efe0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
eff0: 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
f000: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
f010: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
f020: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
f030: 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72  RANS_WRITE && wr
f040: 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
f050: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f060: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
f070: 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
f080: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
f090: 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
f0a0: 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
f0b0: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
f0c0: 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
f0d0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
f0e0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
f0f0: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
f100: 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
f110: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f120: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
f130: 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
f140: 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  begun;.      }. 
f150: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
f160: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20  .  do {.    if( 
f170: 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
f180: 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  {.      do{.    
f190: 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72      rc = lockBtr
f1a0: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  ee(pBt);.      }
f1b0: 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
f1c0: 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c  e1==0 && rc==SQL
f1d0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a  ITE_OK );.    }.
f1e0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f1f0: 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
f200: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42   ){.      if( pB
f210: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
f220: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f230: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
f240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f250: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f260: 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
f270: 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77  age1->pDbPage, w
f280: 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20  rflag>1);.      
f290: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f2a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
f2b0: 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
f2c0: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
f2d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f2e0: 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53    .    if( rc==S
f2f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f300: 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 20 70    if( wrflag ) p
f310: 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
f320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f330: 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
f340: 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
f350: 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
f360: 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
f370: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
f380: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
f390: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f3a0: 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79  3BtreeInvokeBusy
f3b0: 48 61 6e 64 6c 65 72 28 70 42 74 2c 20 30 29 20  Handler(pBt, 0) 
f3c0: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
f3d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
f3e0: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
f3f0: 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
f400: 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
f410: 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  tion++;.    }.  
f420: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
f430: 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
f440: 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
f450: 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
f460: 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
f470: 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
f480: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f490: 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
f4a0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f4b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
f4c0: 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77  _CACHE.    if( w
f4d0: 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20  rflag>1 ){.     
f4e0: 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
f4f0: 45 78 63 6c 75 73 69 76 65 20 29 3b 0a 20 20 20  Exclusive );.   
f500: 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69     pBt->pExclusi
f510: 76 65 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65  ve = p;.    }.#e
f520: 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73  ndif.  }...trans
f530: 5f 62 65 67 75 6e 3a 0a 20 20 62 74 72 65 65 49  _begun:.  btreeI
f540: 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
f550: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
f560: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
f570: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
f580: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
f590: 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
f5a0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
f5b0: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
f5c0: 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
f5d0: 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
f5e0: 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
f5f0: 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
f600: 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
f610: 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
f620: 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
f630: 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
f640: 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
f650: 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
f660: 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
f670: 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
f680: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
f6b0: 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
f6c0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f6f0: 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
f700: 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
f710: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f730: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
f740: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
f750: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
f760: 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d  int isInitOrig =
f770: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
f780: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
f790: 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
f7a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f7b0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
f7c0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
f7d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
f7e0: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
f7f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f800: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
f810: 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
f820: 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
f830: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
f840: 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
f850: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
f860: 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
f870: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
f880: 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   i);..    rc = p
f890: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
f8a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
f8b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f8c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
f8d0: 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
f8e0: 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
f8f0: 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
f900: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
f910: 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
f920: 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
f930: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
f940: 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
f950: 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
f960: 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  EE, pgno);.     
f970: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f980: 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68  OK ) goto set_ch
f990: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
f9a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
f9b0: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
f9c0: 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
f9d0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
f9e0: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
f9f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
fa00: 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72  ]);.    rc = ptr
fa10: 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
fa20: 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
fa30: 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  REE, pgno);.  }.
fa40: 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
fa50: 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
fa60: 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
fa70: 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
fa80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
fa90: 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20  where on pPage, 
faa0: 77 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74  which is guarent
fab0: 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65  eed to be a btre
fac0: 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f  e page, not an o
fad0: 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c  verflow.** page,
fae0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
faf0: 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64   page iFrom. Mod
fb00: 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
fb10: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
fb20: 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61  ts to.** iTo. Pa
fb30: 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
fb40: 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
fb50: 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62   of pointer to b
fb60: 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a  e modified, as .
fb70: 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  ** follows:.**.*
fb80: 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
fb90: 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
fba0: 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
fbb0: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
fbc0: 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
fbe0: 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
fbf0: 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
fc00: 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
fc10: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
fc20: 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
fc30: 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
fc40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
fc50: 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
fc60: 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
fc70: 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
fc80: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
fc90: 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
fca0: 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
fcb0: 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
fcc0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
fcd0: 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
fce0: 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
fcf0: 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
fd00: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
fd10: 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
fd20: 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
fd30: 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
fd40: 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
fd50: 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
fd60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
fd70: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
fd80: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54  tex) );.  if( eT
fd90: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
fda0: 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
fdb0: 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
fdc0: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
fdd0: 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
fde0: 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
fdf0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
fe00: 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
fe10: 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
fe20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fe30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fe40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
fe50: 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
fe60: 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
fe70: 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
fe80: 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
fe90: 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
fea0: 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
feb0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
fec0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
fed0: 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
fee0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
fef0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
ff00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
ff10: 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
ff20: 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
ff30: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
ff40: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
ff50: 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
ff60: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
ff70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
ff80: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
ff90: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
ffa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
ffb0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
ffc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
ffd0: 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
ffe0: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
fff0: 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ow]) ){.        
10000 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
10010 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
10020 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
10030 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10050 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
10060 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
10070 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
10080 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
10090 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
100a0 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
100b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
100c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
100d0 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
100e0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
100f0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
10100 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
10110 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
10120 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
10130 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
10140 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
10150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10160 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
10170 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
10180 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
10190 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
101a0 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
101b0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
101c0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
101d0 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
101e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
101f0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
10200 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
10210 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
10220 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
10230 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
10240 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
10250 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
10260 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61  ns valid..*/.sta
10270 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
10280 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10290 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
102a0 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
102b0 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
102c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
102d0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
102e0 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
102f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
10300 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
10310 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
10320 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
10330 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
10340 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
10350 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
10360 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
10370 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
10380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10390 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
103a0 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
103b0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29    int isCommit.)
103c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
103d0 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
103e0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
103f0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
10400 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
10410 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
10420 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
10430 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
10440 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
10450 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
10460 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
10470 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
10480 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
10490 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
104a0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
104b0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
104c0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
104d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
104e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
104f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10500 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
10510 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
10520 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
10530 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
10540 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
10550 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
10560 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
10570 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
10580 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
10590 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
105a0 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
105b0 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
105c0 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
105d0 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
105e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
105f0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
10600 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
10610 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
10620 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
10630 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10640 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10650 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
10660 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
10670 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
10680 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
10690 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
106a0 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
106b0 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
106c0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
106d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
106e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
106f0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
10700 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
10710 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
10720 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
10730 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
10740 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
10750 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
10760 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
10770 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
10780 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
10790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
107a0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
107b0 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
107c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
107d0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
107e0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
107f0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
10800 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
10810 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
10820 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
10830 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
10840 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
10850 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
10860 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
10870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10890 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
108a0 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
108b0 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
108c0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
108d0 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
108e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
108f0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
10900 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
10910 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
10920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
10930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10940 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10960 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
10970 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
10980 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
10990 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
109a0 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
109b0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
109c0 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
109d0 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
109e0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
109f0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
10a00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
10a10 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
10a20 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
10a30 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
10a40 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
10a50 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
10a60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10a70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10a90 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
10aa0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
10ab0 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
10ac0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10ae0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
10af0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
10b00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
10b10 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
10b20 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
10b30 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
10b40 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
10b50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10b60 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
10b70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10b80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
10b90 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
10ba0 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
10bb0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  PtrPage);.    }.
10bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10bd0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
10be0 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
10bf0 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
10c00 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
10c10 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
10c20 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
10c30 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
10c40 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
10c50 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
10c60 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
10c70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
10c80 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
10c90 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74  ccessful,.** ret
10ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
10cb0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
10cc0 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
10cd0 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f  erefore no.** po
10ce0 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74  int in calling t
10cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
10d00 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
10d10 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d  TE_DONE..**.** M
10d20 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
10d30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
10d40 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
10d50 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61  anize the .** da
10d60 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
10d70 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
10d80 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
10d90 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20  ly in use.** is 
10da0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
10db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
10dc0 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  Fin parameter is
10dd0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69   non-zero, the i
10de0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73  mplementation as
10df0 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  sumes.** that th
10e00 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  e caller will ke
10e10 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
10e20 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
10e30 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20  l.** it returns 
10e40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
10e50 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61  n error, and tha
10e60 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a  t nFin is the.**
10e70 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10e90 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  le will contain 
10ea0 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70  after this .** p
10eb0 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65  rocess is comple
10ec0 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
10ed0 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
10ee0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
10ef0 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67  Pgno nFin){.  Pg
10f00 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20  no iLastPg;     
10f10 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
10f20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
10f30 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  base */.  Pgno n
10f40 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
10f50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10f60 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
10f70 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
10f80 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
10f90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10fa0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10fb0 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e  iLastPg = pBt->n
10fc0 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61  Trunc;.  if( iLa
10fd0 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69  stPg==0 ){.    i
10fe0 4c 61 73 74 50 67 20 3d 20 70 61 67 65 72 50 61  LastPg = pagerPa
10ff0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
11000 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
11010 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
11020 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
11030 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
11040 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
11050 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
11060 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
11070 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
11080 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
11090 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
110a0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
110b0 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
110c0 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69  eeList==0 || nFi
110d0 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20  n==iLastPg ){.  
110e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
110f0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
11100 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
11110 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
11120 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
11130 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
11140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11150 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11160 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
11170 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
11180 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
11190 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
111a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
111b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
111c0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
111d0 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d  .      if( nFin=
111e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
111f0 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
11200 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
11210 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
11220 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
11230 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46          ** if nF
11240 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  in is non-zero. 
11250 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
11260 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
11270 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
11280 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
11290 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
112a0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
112b0 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
112c0 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
112d0 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
112e0 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
112f0 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
11300 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
11310 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
11320 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
11330 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
11340 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
11350 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
11360 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
11370 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  stPg, 1);.      
11380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11390 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
113a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
113b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
113c0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
113d0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
113e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
113f0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
11400 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
11410 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11430 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
11440 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
11450 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
11460 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
11470 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
11480 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
11490 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
114a0 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
114b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
114c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
114d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
114e0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
114f0 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
11500 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
11510 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
11520 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
11530 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
11540 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
11550 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
11560 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
11570 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
11580 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
11590 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
115a0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
115b0 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
115c0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
115d0 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
115e0 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
115f0 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
11600 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
11610 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
11620 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
11630 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
11640 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
11650 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
11660 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
11670 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
11680 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
11690 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
116a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
116b0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
116c0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
116d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
116e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
116f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
11700 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
11710 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
11720 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
11730 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
11740 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
11750 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
11760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
11770 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
11780 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
11790 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
117a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
117b0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
117c0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
117d0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
117e0 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d   iFreePg, nFin!=
117f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
11800 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
11810 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
11820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11830 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11840 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
11850 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d 3e    }.  }..  pBt->
11860 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50 67  nTrunc = iLastPg
11870 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70   - 1;.  while( p
11880 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e 44  Bt->nTrunc==PEND
11890 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
118a0 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47  t)||PTRMAP_ISPAG
118b0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72 75  E(pBt, pBt->nTru
118c0 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  nc) ){.    pBt->
118d0 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20  nTrunc--;.  }.  
118e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
118f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
11900 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
11910 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
11920 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
11930 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
11940 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
11950 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
11960 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
11970 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
11980 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
11990 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
119a0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
119b0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
119c0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
119d0 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
119e0 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
119f0 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
11a00 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  no error occured
11a10 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
11a20 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
11a30 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
11a40 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
11a50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11a60 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
11a70 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
11a80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11a90 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
11aa0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11ab0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
11ac0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
11ad0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
11ae0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
11af0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
11b00 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
11b10 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
11b20 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
11b30 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
11b40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c  }else{.    inval
11b50 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
11b60 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
11b70 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
11b80 74 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d  tep(pBt, 0);.  }
11b90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11ba0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11bc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11bd0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
11be0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
11bf0 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
11c00 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
11c10 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
11c20 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
11c30 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
11c40 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
11c50 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
11c60 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
11c70 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
11c80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11c90 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
11ca0 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
11cb0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
11cc0 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
11cd0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
11ce0 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
11cf0 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
11d00 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
11d10 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
11d20 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
11d30 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
11d40 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
11d50 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29  , Pgno *pnTrunc)
11d60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11d70 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
11d80 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
11d90 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
11da0 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
11db0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
11dc0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
11dd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11de0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11df0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
11e00 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
11e10 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
11e20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
11e30 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
11e40 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11e50 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
11e60 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
11e70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b  Bt->nTrunc==0 ){
11e80 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  .      Pgno nFre
11e90 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  e;.      Pgno nP
11ea0 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e  trmap;.      con
11eb0 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
11ec0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
11ed0 20 20 20 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70     int nOrig = p
11ee0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
11ef0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  t->pPager);..   
11f00 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
11f10 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
11f20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
11f30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11f40 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
11f50 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d        if( nOrig=
11f60 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
11f70 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
11f80 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20     nOrig--;.    
11f90 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
11fa0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
11fb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
11fc0 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d  6]);.      nPtrm
11fd0 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
11fe0 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
11ff0 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a  pBt, nOrig)+pgsz
12000 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20  /5)/(pgsz/5);.  
12010 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67      nFin = nOrig
12020 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
12030 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  ap;.      if( nO
12040 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
12050 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
12060 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in<=PENDING_BYTE
12070 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
12080 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
12090 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
120a0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
120b0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
120c0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
120d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
120e0 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
120f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12100 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
12110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12120 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
12130 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a  tep(pBt, nFin);.
12140 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
12150 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
12160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 46  .      assert(nF
12170 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54  in==0 || pBt->nT
12180 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c  runc==0 || nFin<
12190 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20  =pBt->nTrunc);. 
121a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
121b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  _OK;.      if( p
121c0 42 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46  Bt->nTrunc && nF
121d0 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  in ){.        rc
121e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
121f0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
12200 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
12210 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
12220 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
12230 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
12240 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
12250 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
12260 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  6], 0);.        
12270 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46  pBt->nTrunc = nF
12280 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
12290 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
122a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
122b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
122c0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
122d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
122e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
122f0 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20  .    *pnTrunc = 
12300 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20  pBt->nTrunc;.   
12310 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30   pBt->nTrunc = 0
12320 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
12330 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
12340 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
12350 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
12360 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
12370 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12380 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
12390 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
123a0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
123b0 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
123c0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
123d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
123e0 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
123f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
12400 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
12410 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
12420 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
12430 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
12440 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
12450 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
12460 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
12470 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
12480 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
12490 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
124a0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
124b0 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
124c0 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
124d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
124e0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
124f0 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
12500 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
12510 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
12520 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
12530 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
12540 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
12550 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
12560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12570 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
12580 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
12590 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
125a0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
125b0 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
125c0 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
125d0 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
125e0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
125f0 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
12600 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
12610 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
12620 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
12630 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72 20  reeCommit() for 
12640 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
12650 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
12660 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
12670 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
12680 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
12690 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
126a0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
126b0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
126c0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
126d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
126e0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
126f0 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
12700 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
12710 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
12720 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
12730 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
12740 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
12750 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
12760 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
12770 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
12780 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
12790 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
127a0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
127b0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
127c0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
127d0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
127e0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
127f0 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
12800 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
12810 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
12820 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
12830 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
12840 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
12850 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
12860 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
12870 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
12880 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
12890 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
128a0 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
128b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
128c0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
128d0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
128e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
128f0 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
12900 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
12910 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
12920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12930 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
12940 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
12950 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
12960 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
12970 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d 20    Pgno nTrunc = 
12980 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  0;.    sqlite3Bt
12990 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
129a0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
129b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
129c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
129d0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
129e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
129f0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
12a00 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e 54  mCommit(pBt, &nT
12a10 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69 66  runc); .      if
12a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12a30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12a40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12a50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12a60 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
12a70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
12a80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
12a90 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
12aa0 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
12ab0 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b 0a 20  r, nTrunc, 0);. 
12ac0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
12ad0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
12ae0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12af0 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
12b00 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
12b10 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
12b20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12b30 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
12b40 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
12b50 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
12b60 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
12b70 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
12b80 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
12b90 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
12ba0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
12bb0 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  ed.** prior to c
12bc0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
12bd0 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
12be0 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75  3BtreeSync() rou
12bf0 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20  tine did.** all 
12c00 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
12c10 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
12c20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
12c30 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
12c40 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
12c50 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
12c60 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
12c70 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
12c80 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
12c90 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
12ca0 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
12cb0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
12cc0 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61 75  al.** (which cau
12cd0 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
12ce0 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
12cf0 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  nd drop locks..*
12d00 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
12d10 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
12d20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
12d30 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
12d40 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
12d50 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
12d60 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
12d70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
12d80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12d90 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
12da0 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  o(Btree *p){.  B
12db0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
12dc0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
12dd0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12de0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
12df0 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  b;.  btreeIntegr
12e00 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
12e10 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
12e20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
12e30 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
12e40 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
12e50 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
12e60 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
12e70 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
12e80 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
12e90 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
12ea0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
12eb0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
12ec0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12ed0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
12ee0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
12ef0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
12f00 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
12f10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12f20 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
12f30 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
12f40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12f70 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
12f80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
12f90 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
12fa0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
12fb0 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53  AD;.    pBt->inS
12fc0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 75  tmt = 0;.  }.  u
12fd0 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70  nlockAllTables(p
12fe0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
12ff0 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20 6b  handle has any k
13000 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
13010 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
13020 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
13030 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66  on.  ** count of
13040 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
13050 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
13060 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61 63  ction count reac
13070 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a 20  hes 0, set.  ** 
13080 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
13090 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
130a0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
130b0 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20 62  fUnused() call b
130c0 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20 75  elow.  ** will u
130d0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
130e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
130f0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
13100 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e  NE ){.    pBt->n
13110 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
13120 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
13130 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
13140 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
13150 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
13160 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NONE;.    }.  }.
13170 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68 61  .  /* Set the ha
13180 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74 72  ndles current tr
13190 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
131a0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
131b0 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68  d unlock.  ** th
131c0 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  e pager if this 
131d0 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
131e0 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
131f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
13200 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61 6e    */.  p->inTran
13210 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
13220 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
13230 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62  nused(pBt);..  b
13240 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
13250 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13260 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13270 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13280 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
13290 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
132a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
132b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
132c0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
132d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
132e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
132f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
13300 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
13310 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
13320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
13330 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
13340 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29  ommitPhaseTwo(p)
13350 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
13360 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13370 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
13380 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
13390 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
133a0 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
133b0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
133c0 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
133d0 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
133e0 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
133f0 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
13400 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
13410 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
13420 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
13430 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
13440 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
13450 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
13460 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
13470 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
13480 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
13490 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
134a0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
134b0 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
134c0 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
134d0 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
134e0 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
134f0 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
13500 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
13510 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
13520 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
13530 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
13540 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
13550 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
13560 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
13570 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
13580 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
13590 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
135a0 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
135b0 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
135c0 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
135d0 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
135e0 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
135f0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
13600 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
13610 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
13620 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
13630 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
13640 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
13650 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
13660 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
13670 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
13680 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
13690 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
136a0 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
136b0 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
136c0 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
136d0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
136e0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
136f0 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
13700 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
13710 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
13720 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13730 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
13740 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
13750 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
13760 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
13770 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
13780 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
13790 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
137a0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
137b0 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
137c0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
137d0 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
137e0 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
137f0 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
13800 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
13810 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
13820 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
13830 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
13840 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
13850 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
13860 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
13870 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
13880 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
13890 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
138a0 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
138b0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
138c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
138d0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
138e0 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
138f0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
13900 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 73 71  ->pNext){.    sq
13910 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
13920 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d  ursor(p);.    p-
13930 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
13940 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73  _FAULT;.    p->s
13950 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  kip = errCode;. 
13960 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
13970 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
13980 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
13990 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
139a0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
139b0 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
139c0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
139d0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
139e0 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
139f0 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
13a00 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
13a10 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
13a20 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
13a30 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
13a40 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
13a50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
13a60 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
13a70 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
13a80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
13a90 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
13aa0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
13ab0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
13ac0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
13ad0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13ae0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
13af0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
13b00 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
13b10 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
13b20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
13b30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13b40 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
13b50 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
13b60 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
13b70 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69  s(pBt, 0, 0);.#i
13b80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13b90 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13bb0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  OK ){.    /* Thi
13bc0 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20  s is a horrible 
13bd0 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f  situation. An IO
13be0 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
13bf0 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  or occured whils
13c00 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
13c10 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
13c20 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
13c30 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
13c40 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
13c50 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
13c60 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
13c70 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
13c80 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
13c90 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
13ca0 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
13cb0 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
13cc0 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
13cd0 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
13ce0 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
13cf0 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
13d00 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
13d10 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
13d20 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
13d30 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
13d40 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
13d50 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
13d60 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
13d70 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
13d80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
13d90 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
13da0 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   rc);.  }.#endif
13db0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
13dc0 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c  y(p);.  unlockAl
13dd0 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69  lTables(p);..  i
13de0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13df0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
13e00 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e    int rc2;..#ifn
13e10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13e20 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
13e30 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  Bt->nTrunc = 0;.
13e40 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65  #endif..    asse
13e50 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
13e60 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
13e70 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
13e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
13e90 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
13ea0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
13eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13ec0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
13ed0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
13ee0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
13ef0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
13f00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
13f10 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
13f20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65  call sqlite3Btre
13f30 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
13f40 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
13f50 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
13f60 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
13f70 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
13f80 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13f90 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
13fa0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
13fb0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
13fc0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
13fd0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
13fe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
13ff0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70  ntWriteCursors(p
14000 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42  Bt)==0 );.    pB
14010 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14020 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
14030 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   }..  if( p->inT
14040 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
14050 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14060 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
14070 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  n>0 );.    pBt->
14080 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
14090 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
140a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
140b0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
140c0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
140d0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
140e0 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  ..  p->inTrans =
140f0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
14100 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
14110 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
14120 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62  nused(pBt);..  b
14130 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
14140 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14150 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14160 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14170 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
14180 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
14190 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  .  The subtransa
141a0 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e  ction can.** can
141b0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
141c0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
141d0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
141e0 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75  ction..** You mu
141f0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
14200 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74  action before st
14210 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
14220 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  saction..** The 
14230 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
14240 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
14250 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69  cally if the mai
14260 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  n transaction.**
14270 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
14280 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  s back..**.** On
14290 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61  ly one subtransa
142a0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
142b0 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ive at a time.  
142c0 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74  It is an error t
142d0 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72  o try.** to star
142e0 74 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73  t a new subtrans
142f0 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65  action if anothe
14300 72 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  r subtransaction
14310 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
14320 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ve..**.** Statem
14330 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
14340 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
14350 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
14360 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
14370 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
14380 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
14390 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
143a0 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
143b0 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
143c0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
143d0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
143e0 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
143f0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
14400 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
14410 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
14420 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
14430 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
14440 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
14450 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
14460 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
14470 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
14480 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
144a0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
144b0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
144c0 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
144d0 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
144e0 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
144f0 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
14500 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
14510 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
14520 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
14530 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14540 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14550 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
14560 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
14570 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Only ? SQLITE_OK
14580 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   : sqlite3PagerS
14590 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  tmtBegin(pBt->pP
145a0 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
145b0 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
145c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
145d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
145e0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
145f0 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65  ommit the statme
14600 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
14610 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
14620 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a  rogress.  If no.
14630 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  ** subtransactio
14640 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 69  n is active, thi
14650 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  s is a no-op..*/
14660 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14670 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65  eCommitStmt(Btre
14680 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
14690 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
146a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
146b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
146c0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
146d0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d  ->db;.  if( pBt-
146e0 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d  >inStmt && !pBt-
146f0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14710 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74  erStmtCommit(pBt
14720 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  ->pPager);.  }el
14730 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
14740 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42  ITE_OK;.  }.  pB
14750 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
14760 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14770 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
14780 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
14790 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65  lback the active
147a0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
147b0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e  ansaction.  If n
147c0 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  o subtransaction
147d0 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74 68  .** is active th
147e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
147f0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  no-op..**.** All
14800 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
14810 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
14820 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
14830 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20   Any attempt.** 
14840 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 20  to use a cursor 
14850 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
14860 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
14870 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
14880 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  .** will result 
14890 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  in an error..*/.
148a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
148b0 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72  RollbackStmt(Btr
148c0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
148d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
148e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
148f0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
14900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14910 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
14920 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  b;.  if( pBt->in
14930 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
14940 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
14950 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14960 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  tmtRollback(pBt-
14970 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42  >pPager);.    pB
14980 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
14990 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
149a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
149b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
149c0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
149d0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
149e0 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
149f0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
14a00 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74  iTable.  The act
14a10 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20   of acquiring a 
14a20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65  cursor gets a re
14a30 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74  ad lock on .** t
14a40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14a50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
14a60 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
14a70 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
14a80 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
14a90 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
14aa0 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
14ab0 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
14ac0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
14ad0 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
14ae0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
14af0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
14b00 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
14b10 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
14b20 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
14b30 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
14b40 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
14b50 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
14b60 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
14b70 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
14b80 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
14b90 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
14ba0 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
14bb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
14bc0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
14bd0 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
14be0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
14bf0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
14c00 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
14c10 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
14c20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
14c30 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
14c40 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
14c50 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
14c60 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
14c70 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
14c80 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
14c90 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
14ca0 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
14cb0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
14cc0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
14cd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
14ce0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
14cf0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
14d00 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
14d10 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
14d20 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
14d30 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
14d40 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
14d50 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
14d60 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
14d70 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
14d80 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
14d90 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
14da0 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
14db0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
14dc0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
14dd0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
14de0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
14df0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
14e00 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
14e10 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
14e20 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65 73  rsorSize() bytes
14e30 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70   of memory .** p
14e40 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43 75  ointed to by pCu
14e50 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72 6f  r have been zero
14e60 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
14e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14e80 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
14e90 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
14ec0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
14ed0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ef0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
14f00 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
14f10 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
14f40 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
14f50 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
14f60 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
14f70 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
14f80 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
14f90 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
14fa0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
14fb0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
14fe0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
14ff0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
15000 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15010 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
15020 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
15030 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
15040 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66  wrFlag ){.    if
15050 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
15060 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15070 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15080 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
15090 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
150a0 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 20 29   iTable, 0, 0) )
150b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
150c0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
150d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
150e0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b  Bt->pPage1==0 ){
150f0 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74  .    rc = lockBt
15100 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b  reeWithRetry(p);
15110 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15130 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15140 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
15150 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67  adOnly && wrFlag
15160 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15170 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
15190 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
151a0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69  Pgno)iTable;.  i
151b0 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
151c0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
151d0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29  Bt->pPager)==0 )
151e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
151f0 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74  E_EMPTY;.    got
15200 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
15210 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
15220 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
15230 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
15240 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
15250 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69  >apPage[0]);.  i
15260 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15270 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65   ){.    goto cre
15280 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
15290 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
152a0 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
152b0 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
152c0 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
152d0 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
152e0 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
152f0 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  s, link the curs
15300 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
15310 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65  ared list and se
15320 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20  t *ppCur (the.  
15330 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65  ** output argume
15340 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
15350 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75  ion)..  */.  pCu
15360 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
15370 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
15380 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
15390 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
153a0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20   pCur->wrFlag = 
153b0 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
153c0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
153d0 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
153e0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
153f0 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
15400 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
15410 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
15420 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
15430 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
15440 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ALID;..  return 
15450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61  SQLITE_OK;..crea
15460 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
15470 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  ion:.  releasePa
15480 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
15490 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  0]);.  unlockBtr
154a0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
154b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
154c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
154d0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
154e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15510 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
15520 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
15550 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
15560 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
15570 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
155a0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
155b0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
155c0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
155e0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
155f0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
15600 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
15630 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
15640 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
15650 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
15660 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
15670 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
15680 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
15690 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
156a0 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
156b0 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
156c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
156d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
156e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
156f0 43 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20  CursorSize(){.  
15700 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74  return sizeof(Bt
15710 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a  Cursor);.}..../*
15720 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
15730 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
15740 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
15750 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
15760 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
15770 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
15780 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
15790 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
157a0 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
157b0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
157c0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
157d0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
157e0 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
157f0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
15800 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
15810 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15820 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
15830 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42      pBt->db = pB
15840 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 73 71  tree->db;.    sq
15850 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
15860 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
15870 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
15880 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
15890 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
158a0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
158b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
158c0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
158d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
158e0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
158f0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
15900 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
15910 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
15920 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
15930 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
15940 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
15950 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
15960 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
15970 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
15980 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
15990 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
159a0 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
159b0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
159c0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
159d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
159e0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
159f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15a00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15a10 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
15a20 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
15a30 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
15a40 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
15a50 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
15a60 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
15a70 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
15a80 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
15a90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
15aa0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
15ab0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
15ac0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70   BtCursor *pTemp
15ad0 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
15ae0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15af0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
15b00 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d  );.  memcpy(pTem
15b10 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65  pCur, pCur, size
15b20 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20  of(BtCursor));. 
15b30 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
15b40 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
15b50 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66  ->pPrev = 0;.  f
15b60 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70  or(i=0; i<=pTemp
15b70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
15b80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
15b90 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
15ba0 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
15bb0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
15bc0 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f  * Delete a tempo
15bd0 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68  rary cursor such
15be0 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20   as was made by 
15bf0 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72  the CreateTempor
15c00 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66  aryCursor().** f
15c10 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a  unction above..*
15c20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
15c30 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
15c40 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
15c50 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
15c60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15c70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
15c80 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
15c90 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
15ca0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  +){.    sqlite3P
15cb0 61 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e  agerUnref(pCur->
15cc0 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
15cd0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
15ce0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15cf0 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
15d00 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
15d10 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
15d20 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
15d30 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
15d40 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
15d50 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c  lid, call.** sql
15d60 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
15d70 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
15d80 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
15d90 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
15da0 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
15db0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
15dc0 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
15dd0 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
15de0 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
15df0 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71  r of calls to sq
15e00 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15e10 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
15e20 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
15e30 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
15e40 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
15e50 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
15e60 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
15e70 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
15e80 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
15e90 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
15ea0 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
15eb0 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
15ec0 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
15ed0 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
15ee0 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
15ef0 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
15f00 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
15f10 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
15f20 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
15f30 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
15f40 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
15f50 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
15f60 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
15f70 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
15f80 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
15f90 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
15fa0 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
15fb0 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
15fc0 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
15fd0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
15fe0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
15ff0 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
16000 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
16010 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
16020 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
16030 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
16040 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73  of(info));.    s
16050 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
16060 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
16070 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
16080 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
16090 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
160a0 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  ( memcmp(&info, 
160b0 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
160c0 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
160d0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
160e0 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
160f0 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
16100 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
16110 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
16120 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
16130 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
16140 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
16150 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
16160 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
16170 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
16180 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
16190 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
161a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
161b0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
161c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
161d0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
161e0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
161f0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
16200 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
16210 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
16220 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
16230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
16240 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
16250 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
16260 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
16270 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
16280 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
16290 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
162a0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
162b0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
162c0 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
162d0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
16320 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
16330 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
16370 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
16380 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69        \.    sqli
163c0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
163d0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
163e0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
163f0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
16400 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75  info); \.    pCu
16410 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
16420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16450 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
16460 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
16470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
164b0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
164c0 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
16500 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
16510 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ER */../*.** Set
16520 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
16530 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
16540 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
16550 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
16560 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
16570 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
16580 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
16590 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
165a0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
165b0 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
165c0 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
165d0 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
165e0 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
165f0 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
16600 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
16610 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
16620 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
16630 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
16640 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16650 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
16660 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
16670 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
16680 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
16690 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
166a0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
166b0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
166c0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
166d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
166e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
166f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
16700 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
16710 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
16720 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
16730 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
16740 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
16750 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a  D ){.      *pSiz
16760 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
16770 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  {.      getCellI
16780 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
16790 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
167a0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d  info.nKey;.    }
167b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
167c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
167d0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
167e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
167f0 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
16800 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
16810 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
16820 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74   to.  Always ret
16830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
16840 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
16850 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74   possible.  If t
16860 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
16870 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
16880 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74  inting to an ent
16890 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61  ry (which can ha
168a0 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  ppen, for exampl
168b0 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74  e, if.** the dat
168c0 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20  abase is empty) 
168d0 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73  then *pSize is s
168e0 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20  et to 0..*/.int 
168f0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
16900 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
16910 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
16920 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
16930 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
16940 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
16950 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
16960 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
16970 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
16980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16990 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
169a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
169b0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
169c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
169d0 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
169e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
169f0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
16a00 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74      /* Not point
16a10 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20 65  ing at a valid e
16a20 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a  ntry - set *pSiz
16a30 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20  e to 0. */.     
16a40 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
16a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
16a60 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
16a70 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
16a80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
16a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
16aa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16ab0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
16ac0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
16ad0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
16ae0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
16af0 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
16b00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
16b10 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
16b20 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
16b30 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
16b40 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
16b50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
16b60 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
16b70 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
16b80 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
16b90 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
16ba0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
16bb0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
16bc0 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
16bd0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
16be0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
16bf0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
16c00 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
16c10 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  wise:.**.** Unle
16c20 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  ss pPgnoNext is 
16c30 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20 6e  NULL, the page n
16c40 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
16c50 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70  t overflow .** p
16c60 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
16c70 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74 65  d list is writte
16c80 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
16c90 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a 2a   If page ovfl.**
16ca0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
16cb0 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
16cc0 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
16cd0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
16ce0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
16cf0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a  e is not NULL, *
16d00 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
16d10 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68 61   the MemPage* ha
16d20 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67 65  ndle.** for page
16d30 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65 72   ovfl. The under
16d40 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61 67 65  lying pager page
16d50 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 72   may have been r
16d60 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74 68  equested.** with
16d70 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
16d80 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65 20  lag set, so the 
16d90 70 61 67 65 20 64 61 74 61 20 61 63 63 65 73 73  page data access
16da0 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69 73  able via.** this
16db0 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74 20   handle may not 
16dc0 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a 73  be trusted..*/.s
16dd0 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
16de0 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
16df0 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 50  hared *pBt, .  P
16e00 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
16e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16e20 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a  verflow page */.
16e30 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
16e40 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
16e50 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
16e60 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  andle */.  Pgno 
16e70 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
16e80 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16e90 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
16ea0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
16eb0 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
16ec0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
16ed0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16ee0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
16ef0 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65  tex) );.  /* One
16f00 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20 6e   of these must n
16f10 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65  ot be NULL. Othe
16f20 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c 20  rwise, why call 
16f30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a  this function? *
16f40 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61 67  /.  assert(ppPag
16f50 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b  e || pPgnoNext);
16f60 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e  ..  /* If pPgnoN
16f70 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ext is NULL, the
16f80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
16f90 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
16fa0 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61  to obtain.  ** a
16fb0 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72 65   MemPage* refere
16fc0 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67  nce only. No pag
16fd0 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69 72  e-data is requir
16fe0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
16ff0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67  .  */.  if( !pPg
17000 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72 65  noNext ){.    re
17010 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
17020 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
17030 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a  fl, ppPage, 1);.
17040 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
17050 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
17060 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
17070 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
17080 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
17090 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
170a0 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
170b0 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
170c0 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
170d0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
170e0 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
170f0 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
17100 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
17110 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
17120 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
17130 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
17140 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
17150 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
17160 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
17170 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
17180 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
17190 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
171a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
171b0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
171c0 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
171d0 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
171e0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
171f0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
17200 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
17210 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
17220 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
17230 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
17240 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
17250 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
17260 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
17270 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
17280 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
17290 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
172a0 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
172b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
172c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
172d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
172e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
172f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
17300 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
17310 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
17320 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
17330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17340 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
17350 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61   next==0 || ppPa
17360 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  ge ){.    MemPag
17370 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
17380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
17390 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
173a0 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e   ovfl, &pPage, n
173b0 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73  ext!=0);.    ass
173c0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
173d0 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
173e0 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
173f0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
17400 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
17410 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
17420 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a  >aData);.    }..
17430 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20 29      if( ppPage )
17440 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  {.      *ppPage 
17450 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c  = pPage;.    }el
17460 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  se{.      releas
17470 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
17480 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f    }.  }.  *pPgno
17490 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20  Next = next;..  
174a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
174b0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
174c0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
174d0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
174e0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
174f0 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
17500 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
17510 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
17520 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
17530 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
17540 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
17550 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
17560 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
17570 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
17580 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
17590 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
175a0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
175b0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
175c0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
175d0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
175e0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
175f0 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
17600 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
17610 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
17620 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
17630 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
17640 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17650 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
17660 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
17670 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
17680 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
17690 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
176a0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
176b0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
176c0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
176d0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
176e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
176f0 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
17700 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
17710 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17720 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
17730 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
17760 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
17770 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
17780 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
17790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
177a0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
177b0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
177c0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
177d0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
177e0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
177f0 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
17800 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
17810 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
17820 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
17830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
17850 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17860 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
17870 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
17880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
17890 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
178a0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
178b0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
178c0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
178d0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
178e0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
178f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17910 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
17920 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
17930 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
17940 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
17950 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
17960 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
17970 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
17980 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
17990 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
179a0 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
179b0 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
179c0 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
179d0 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
179e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
179f0 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
17a00 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
17a10 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
17a20 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
17a30 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
17a40 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
17a50 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
17a60 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
17a70 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
17a80 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
17a90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
17aa0 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  es not make a di
17ab0 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
17ac0 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a  n key and data..
17ad0 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73  ** It just reads
17ae0 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73   or writes bytes
17af0 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
17b00 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
17b10 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f  ght .** appear o
17b20 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20  n the main page 
17b30 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
17b40 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
17b50 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67  overflow .** pag
17b60 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
17b70 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
17b80 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
17b90 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
17ba0 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
17bb0 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
17bc0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
17bd0 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
17be0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
17bf0 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
17c00 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
17c10 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
17c20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
17c30 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
17c40 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
17c50 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
17c60 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
17c70 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
17c80 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
17c90 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
17ca0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
17cb0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
17cc0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17cd0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
17ce0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
17cf0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
17d00 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
17d10 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
17d20 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
17d30 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
17d40 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
17d50 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
17d60 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
17d70 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
17d80 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
17d90 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
17da0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
17db0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
17dc0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
17dd0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
17de0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
17df0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
17e00 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
17e10 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
17e20 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
17e30 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
17e40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
17e50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
17e60 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
17e70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
17e80 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
17e90 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
17ea0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
17eb0 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20  .  int offset,  
17ec0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
17ed0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
17ee0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
17ef0 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
17f00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
17f10 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
17f20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
17f30 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
17f40 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
17f50 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
17f60 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  / .  int skipKey
17f70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  ,         /* off
17f80 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61  set begins at da
17f90 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
17fa0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20  ue */.  int eOp 
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17fc0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
17fd0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
17fe0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
17ff0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
18000 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18010 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
18020 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
18030 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
18040 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
18050 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
18060 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
18070 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
18080 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
18090 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
180c0 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
180d0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
180e0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
180f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
18100 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
18110 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
18120 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
18130 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
18140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
18150 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  fset>=0 );.  ass
18160 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
18170 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
18180 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
18190 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
181a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
181b0 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
181c0 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20  nHeader;.  nKey 
181d0 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  = (pPage->intKey
181e0 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66   ? 0 : pCur->inf
181f0 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20  o.nKey);..  if( 
18200 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f  skipKey ){.    o
18210 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20  ffset += nKey;. 
18220 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b   }.  if( offset+
18230 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
18240 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20  >info.nData ){. 
18250 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
18260 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
18270 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
18280 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
18290 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
182a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
182b0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
182c0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
182d0 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
182e0 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
182f0 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
18300 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
18310 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
18320 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
18330 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
18340 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
18350 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
18360 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
18370 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
18380 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
18390 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
183a0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
183b0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
183c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
183d0 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
183e0 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
183f0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
18400 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
18410 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
18420 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 70  nLocal;.  }..  p
18430 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
18440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18450 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
18460 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76      const int ov
18470 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
18480 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
18490 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
184a0 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
184b0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
184c0 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
184d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
184e0 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
184f0 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66  o.nLocal]);..#if
18500 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18510 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a  _INCRBLOB.    /*
18520 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c   If the isIncrbl
18530 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
18540 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43   set and the BtC
18550 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
18560 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  ].    ** has not
18570 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
18580 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
18590 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73  . The array is s
185a0 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f  ized at.    ** o
185b0 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
185c0 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
185d0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
185e0 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a  chain. The.    *
185f0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
18600 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
18610 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72  low page is stor
18620 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
18630 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20  0],.    ** etc. 
18640 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20  A value of 0 in 
18650 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
18660 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74  array means "not
18670 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20   yet known".    
18680 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73  ** (the cache is
18690 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
186a0 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
186b0 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  f( pCur->isIncrb
186c0 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43  lobHandle && !pC
186d0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
186e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
186f0 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
18700 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
18710 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
18720 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
18730 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
18740 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29  rflow = (Pgno *)
18750 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
18760 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e  o(sizeof(Pgno)*n
18770 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  Ovfl);.      if(
18780 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d   nOvfl && !pCur-
18790 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
187a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
187b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
187c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
187d0 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  f the overflow p
187e0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
187f0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
18800 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  d and the.    **
18810 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
18820 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
18830 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
18840 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a  alid, skip.    *
18850 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
18860 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18870 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18880 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
18890 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
188a0 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49  ize] ){.      iI
188b0 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
188c0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65  lSize);.      ne
188d0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
188e0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
188f0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
18900 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
18910 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
18920 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
18930 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
18940 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
18950 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66  Idx++){..#ifndef
18960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
18970 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49  RBLOB.      /* I
18980 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
18990 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
189a0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
189b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
189c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
189d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
189e0 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t(!pCur->aOverfl
189f0 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72  ow[iIdx] || pCur
18a00 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18a10 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  ]==nextPage);.  
18a20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
18a30 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65  rflow[iIdx] = ne
18a40 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  xtPage;.      }.
18a50 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66  #endif..      if
18a60 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
18a70 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
18a80 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
18a90 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
18aa0 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
18ab0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
18ac0 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
18ad0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
18ae0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
18af0 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
18b00 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
18b10 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
18b20 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
18b30 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
18b40 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
18b50 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
18b60 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
18b70 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
18b80 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
18b90 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
18ba0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  n..        */.#i
18bb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18bc0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
18bd0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
18be0 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
18bf0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
18c00 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
18c10 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
18c20 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
18c30 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ];.        } els
18c40 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e .#endif.      
18c50 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
18c60 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
18c70 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
18c80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f  Page);.        o
18c90 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
18ca0 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
18cb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
18cc0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
18cd0 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
18ce0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
18cf0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
18d00 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
18d10 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
18d20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
18d30 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
18d40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18d50 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
18d60 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  ;.        int a 
18d70 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72  = amt;.        r
18d80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18d90 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
18da0 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
18db0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
18dc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61  ){.          aPa
18de0 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
18df0 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
18e00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
18e10 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
18e20 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
18e30 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b           if( a +
18e40 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
18e50 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
18e60 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
18e70 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
18e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
18e90 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
18ea0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
18eb0 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  +4], pBuf, a, eO
18ec0 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  p, pDbPage);.   
18ed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
18ee0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
18ef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66  );.          off
18f00 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
18f10 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
18f20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
18f30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18f40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
18f50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18f60 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
18f70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18f80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18f90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
18fb0 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
18fc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
18fd0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
18fe0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
18ff0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
19000 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
19010 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
19020 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
19030 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
19040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
19050 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
19060 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
19070 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
19080 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
19090 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
190a0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
190b0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
190c0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
190d0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
190e0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
190f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
19100 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
19110 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
19120 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
19130 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19140 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
19150 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
19160 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
19170 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
19190 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
191a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
191b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
191c0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
191d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
191e0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
191f0 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50 61 67   if( pCur->apPag
19200 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
19210 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19220 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
19230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19240 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
19250 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
19260 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
19270 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
19280 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
19290 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
192a0 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
192b0 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
192c0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
192d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
192e0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
192f0 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
19300 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
19310 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
19320 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
19330 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
19340 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
19350 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
19360 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
19370 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
19380 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
19390 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
193a0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
193b0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
193c0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
193d0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
193e0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
193f0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
19400 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
19410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19420 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
19430 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
19440 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
19450 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
19460 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
19470 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
19480 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
19490 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
194a0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
194b0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
194c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
194d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
194e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
194f0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
19500 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
19510 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
19520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19530 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
19540 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19550 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
19560 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
19570 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
19580 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
19590 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
195a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
195b0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
195c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
195d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
195e0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
195f0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
19600 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b  mt, pBuf, 1, 0);
19610 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19630 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
19640 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
19650 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
19660 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
19670 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
19680 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
19690 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
196a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
196b0 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
196c0 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
196d0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
196e0 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
196f0 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
19700 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
19710 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
19720 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
19730 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
19740 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
19750 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
19760 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
19770 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
19780 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
19790 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
197a0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
197b0 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
197c0 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
197d0 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
197e0 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
197f0 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
19800 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
19810 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
19820 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
19830 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
19840 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
19850 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
19860 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
19870 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
19880 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
19890 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
198a0 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
198b0 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
198c0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
198d0 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
198e0 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65  eassembly.** the
198f0 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
19900 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
19910 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
19920 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
19930 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
19940 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
19950 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
19960 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
19970 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19980 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
19990 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
199a0 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
199b0 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
199c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
199d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
199e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
199f0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
19a00 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
19a10 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
19a20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
19a30 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
19a40 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
19a50 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19a60 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
19a70 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
19a80 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
19a90 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
19aa0 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
19ab0 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
19ac0 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
19ad0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19ae0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
19af0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
19b00 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c  2 nKey;.  int nL
19b10 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
19b20 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
19b30 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
19b40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
19b50 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
19b60 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
19b70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19b80 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
19b90 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19ba0 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  r) );.  pPage = 
19bb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
19bc0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
19bd0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
19be0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
19bf0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
19c00 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
19c10 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
19c20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
19c30 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
19c40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
19c50 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
19c60 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
19c70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
19c80 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75  {.    nKey = pCu
19c90 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
19ca0 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
19cb0 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
19cc0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
19cd0 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
19ce0 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
19cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
19d00 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
19d10 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
19d20 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
19d30 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
19d40 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
19d50 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
19d60 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
19d70 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
19d80 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
19d90 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
19da0 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
19db0 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
19dc0 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
19dd0 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
19de0 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
19df0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
19e00 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
19e10 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
19e20 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
19e30 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
19e40 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
19e50 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
19e60 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
19e70 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
19e80 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
19e90 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
19ea0 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
19eb0 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
19ec0 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
19ed0 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
19ee0 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
19ef0 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
19f00 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
19f10 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
19f20 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
19f30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
19f40 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
19f50 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
19f60 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
19f70 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
19f80 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
19f90 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
19fa0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
19fb0 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
19fc0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
19fd0 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
19fe0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
19ff0 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
1a000 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1a010 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1a020 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a030 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1a040 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
1a050 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1a060 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1a070 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1a080 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n 0;.}.const voi
1a090 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
1a0a0 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
1a0b0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1a0c0 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  mt){.  assert( c
1a0d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1a0e0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
1a0f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a100 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1a110 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
1a120 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1a130 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
1a140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1a150 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1a160 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a170 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
1a180 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
1a190 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
1a1a0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
1a1b0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
1a1c0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
1a1d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1a1e0 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
1a1f0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
1a200 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
1a210 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
1a220 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
1a230 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1a240 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a250 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
1a260 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a270 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a280 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a290 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a2a0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1a2b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
1a2c0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
1a2d0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1a2e0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
1a2f0 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
1a300 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a310 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1a320 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
1a330 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1a340 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
1a350 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1a360 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
1a370 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
1a380 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
1a390 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
1a3a0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
1a3b0 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
1a3c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1a3d0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1a3e0 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
1a3f0 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
1a400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a410 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1a420 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1a430 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1a440 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  f NDEBUG./*.** P
1a450 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
1a460 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
1a470 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
1a480 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
1a490 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
1a4a0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1a4b0 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
1a4c0 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
1a4d0 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
1a4e0 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
1a4f0 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
1a500 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
1a510 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
1a520 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
1a530 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
1a540 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
1a550 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
1a560 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
1a570 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
1a580 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
1a590 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
1a5a0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
1a5b0 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
1a5c0 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
1a5d0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
1a5e0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
1a5f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a600 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
1a610 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
1a620 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
1a630 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
1a640 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1a650 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1a660 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
1a670 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
1a680 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
1a690 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
1a6a0 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
1a6b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
1a6c0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
1a6d0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
1a6e0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
1a6f0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1a700 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
1a710 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
1a720 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
1a730 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
1a740 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
1a750 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
1a760 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
1a770 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
1a780 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1a790 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
1a7a0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
1a7b0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
1a7c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1a7d0 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
1a7e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1a7f0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a800 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1a820 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a830 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1a840 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1a850 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
1a860 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1a870 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1a880 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1a890 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
1a8a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
1a8b0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
1a8c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1a8d0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
1a8e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1a8f0 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
1a900 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1a910 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1a920 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
1a930 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
1a940 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1a950 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1a960 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
1a970 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a980 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1a990 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1a9a0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1a9b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1a9c0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1a9d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a9e0 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1a9f0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1aa00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1aa10 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1aa20 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1aa30 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1aa40 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1aa50 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1aa60 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1aa70 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1aa80 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1aa90 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1aaa0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1aab0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1aac0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1aad0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1aae0 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1aaf0 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1ab00 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1ab10 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1ab20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1ab30 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1ab40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1ab50 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
1ab60 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
1ab70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
1ab80 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1ab90 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
1aba0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1abb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1abc0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1abd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1abe0 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20  {.    if( .     
1abf0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
1ac00 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
1ac10 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
1ac20 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
1ac30 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a  age[0])).    ){.
1ac40 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1ac50 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1ac60 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
1ac70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1ac80 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
1ac90 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
1aca0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1acb0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
1acc0 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  t );.  pCur->iPa
1acd0 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ge = 0;.  pCur->
1ace0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
1acf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1ad00 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1ad10 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1ad20 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1ad30 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ..  if( pRoot->n
1ad40 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f  Cell==0 && !pRoo
1ad50 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
1ad60 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
1ad70 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1ad80 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73  pgno==1 );.    s
1ad90 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
1ada0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
1adb0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
1adc0 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
1add0 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20  ( subpage>0 );. 
1ade0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1adf0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
1ae00 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1ae10 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
1ae20 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
1ae30 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1ae40 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e   ((pRoot->nCell>
1ae50 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
1ae60 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
1ae70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ae80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1ae90 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
1aea0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
1aeb0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1aec0 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
1aed0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
1aee0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1aef0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
1af00 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
1af10 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1af20 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
1af30 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
1af40 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
1af50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1af60 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
1af70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1af80 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
1af90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1afa0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1afb0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
1afc0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1afd0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1afe0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1aff0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1b000 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1b010 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
1b020 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1b030 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
1b040 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
1b050 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1b060 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
1b070 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1b080 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1b090 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
1b0a0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
1b0b0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
1b0c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1b0d0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1b0e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b0f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1b100 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1b110 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1b120 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1b130 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
1b140 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1b150 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1b160 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
1b170 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
1b180 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
1b190 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
1b1a0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
1b1b0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
1b1c0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
1b1d0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1b1e0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
1b1f0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
1b200 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
1b210 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
1b220 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1b230 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
1b240 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1b250 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
1b260 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1b270 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
1b280 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
1b290 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1b2a0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1b2b0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
1b2c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1b2d0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1b2e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b2f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1b300 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1b310 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1b320 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1b330 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b340 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1b350 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1b360 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1b370 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1b380 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
1b390 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1b3a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1b3b0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1b3c0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1b3d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1b3e0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
1b3f0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1b400 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1b410 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1b420 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1b440 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1b450 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
1b460 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
1b470 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1b480 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1b490 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
1b4a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b4b0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1b4c0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1b4d0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1b4e0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1b4f0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1b500 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1b510 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1b520 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1b530 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1b540 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1b550 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1b560 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1b570 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
1b580 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1b590 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1b5a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1b5b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1b5c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b5d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b5e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1b5f0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1b600 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1b610 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1b620 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b630 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1b640 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b650 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1b660 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1b670 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1b680 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
1b690 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1b6a0 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
1b6b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b6c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1b6d0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1b6e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1b6f0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
1b700 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1b710 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1b720 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1b730 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b740 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1b750 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1b760 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1b770 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1b780 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1b790 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1b7a0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1b7b0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1b7c0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1b7d0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1b7e0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1b7f0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1b800 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b810 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
1b820 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1b830 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1b840 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1b850 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1b860 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1b870 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b880 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1b890 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1b8a0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1b8b0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1b8c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b8d0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1b8e0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1b8f0 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
1b900 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1b910 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1b920 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1b930 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1b940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1b950 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1b960 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1b970 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1b980 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1b990 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1b9a0 43 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43  Cur);.      getC
1b9b0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1b9c0 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
1b9d0 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
1b9e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
1b9f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1ba00 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1ba10 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1ba20 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1ba30 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
1ba40 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
1ba50 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
1ba60 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1ba70 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1ba80 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1ba90 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
1baa0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
1bab0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
1bac0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
1bad0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
1bae0 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
1baf0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
1bb00 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
1bb10 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1bb20 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1bb30 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1bb40 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1bb50 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1bb60 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1bb70 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1bb80 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1bb90 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1bba0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1bbb0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1bbc0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1bbd0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1bbe0 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ey..**.** The re
1bbf0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
1bc00 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
1bc10 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
1bc20 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  h the.** cursor 
1bc30 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
1bc40 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c  Res if pRes!=NUL
1bc50 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  L.  The meaning 
1bc60 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65  of.** this value
1bc70 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1bc80 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
1bc90 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1bca0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1bcb0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1bcc0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1bcd0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
1bce0 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20  er than pKey or 
1bcf0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1bd00 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1bd10 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1bd20 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1bd30 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1bd40 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1bd50 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1bd60 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1bd70 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1bd80 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1bd90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1bda0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1bdb0 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a  ches pKey..**.**
1bdc0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1bdd0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1bde0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1bdf0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1be00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1be10 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1be20 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  n pKey..**.*/.in
1be30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1be40 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
1be50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1be60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1be70 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
1be80 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
1be90 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
1bea0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1beb0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
1bec0 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
1bed0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
1bee0 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
1bef0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
1bf00 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1bf10 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
1bf20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
1bf30 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf50 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
1bf60 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1bf70 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1bf80 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1bf90 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1bfa0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1bfb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1bfc0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1bfd0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
1bfe0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1bff0 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
1c000 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
1c010 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
1c020 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
1c030 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1c040 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1c050 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
1c060 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c070 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
1c080 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
1c090 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
1c0a0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
1c0b0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1c0c0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
1c0d0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1c0e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1c0f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c100 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1c110 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1c120 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
1c130 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1c140 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
1c150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c160 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
1c170 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1c180 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
1c190 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c1a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1c1b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1c1c0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1c1d0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1c1e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1c1f0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1c200 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c210 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1c220 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1c230 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1c240 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1c250 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1c260 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1c270 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1c280 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1c290 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
1c2a0 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
1c2b0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1c2c0 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
1c2d0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
1c2e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1c2f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1c300 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
1c310 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
1c320 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
1c330 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
1c340 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
1c350 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
1c360 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1c370 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1c380 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78  ->intKey && pIdx
1c390 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
1c3a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1c3b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1c3c0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1c3d0 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sh;.    }.    if
1c3e0 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
1c3f0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
1c400 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1c410 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1c420 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1c430 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1c440 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20   (upr+lwr)/2;.  
1c450 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c    }.    if( lwr<
1c460 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a  =upr ) for(;;){.
1c470 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
1c480 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20  lKey;.      i64 
1c490 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1c4a0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
1c4b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1c4c0 65 5d 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  e];.      pCur->
1c4d0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1c4e0 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
1c4f0 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
1c500 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1c510 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ey ){.        u8
1c520 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20   *pCell;.       
1c530 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
1c540 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
1c550 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
1c560 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
1c570 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
1c580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
1c590 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
1c5a0 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
1c5b0 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75  rint32(pCell, du
1c5c0 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mmy);.        }.
1c5d0 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
1c5e0 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
1c5f0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
1c600 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d     if( nCellKey=
1c610 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
1c620 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
1c630 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
1c640 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
1c650 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
1c660 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1c670 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1c680 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  rt( nCellKey>int
1c690 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1c6a0 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
1c6b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1c6c0 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69          int avai
1c6d0 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70  lable;.        p
1c6e0 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20  CellKey = (void 
1c6f0 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1c700 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c  Cur, &available,
1c710 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65   0);.        nCe
1c720 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e  llKey = pCur->in
1c730 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
1c740 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d   if( available>=
1c750 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20  nCellKey ){.    
1c760 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
1c770 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1c780 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65  re(nCellKey, pCe
1c790 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
1c7a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1c7b0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
1c7c0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
1c7d0 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  oc( nCellKey );.
1c7e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1c7f0 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
1c800 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c810 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1c820 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
1c830 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1c840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1c860 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1c870 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20  nCellKey, (void 
1c880 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  *)pCellKey);.   
1c890 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1c8a0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1c8b0 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  are(nCellKey, pC
1c8c0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
1c8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1c8e0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
1c8f0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1c900 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
1c910 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1c920 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c930 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
1c940 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
1c950 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
1c960 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
1c970 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
1c980 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c990 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
1c9a0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
1c9b0 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
1c9c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c9d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c9e0 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73          if( pRes
1c9f0 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20   ) *pRes = 0;.  
1ca00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ca10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1ca20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1ca30 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
1ca40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ca50 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
1ca60 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
1ca70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ca80 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
1ca90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1caa0 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
1cab0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1cac0 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
1cad0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1cae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
1caf0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1cb00 69 50 61 67 65 5d 20 3d 20 28 6c 77 72 2b 75 70  iPage] = (lwr+up
1cb10 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
1cb20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
1cb30 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
1cb40 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1cb50 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1cb60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1cb70 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
1cb80 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
1cb90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
1cba0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1cbb0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1cbc0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1cbd0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
1cbe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
1cbf0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
1cc00 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
1cc10 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
1cc20 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
1cc30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1cc40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1cc50 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
1cc60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1cc70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
1cc80 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
1cc90 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
1cca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ccb0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1ccc0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
1ccd0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1cce0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 6c 77 72 3b  r->iPage] = lwr;
1ccf0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
1cd00 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
1cd10 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1cd20 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
1cd30 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
1cd40 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
1cd50 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
1cd60 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76  _finish;.  }.mov
1cd70 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65  eto_finish:.  re
1cd80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1cd90 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
1cda0 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
1cdb0 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
1cdc0 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
1cdd0 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
1cde0 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
1cdf0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1ce00 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
1ce10 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
1ce20 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
1ce30 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
1ce40 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
1ce50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ce60 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
1ce70 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1ce80 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
1ce90 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
1cea0 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
1ceb0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1cec0 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
1ced0 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
1cee0 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
1cef0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
1cf00 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
1cf10 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
1cf20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
1cf30 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
1cf40 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
1cf50 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
1cf60 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
1cf70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
1cf80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1cf90 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
1cfa0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
1cfb0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1cfc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
1cfd0 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
1cfe0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
1cff0 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
1d000 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
1d010 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1d020 72 64 20 61 53 70 61 63 65 5b 31 36 5d 3b 20 2f  rd aSpace[16]; /
1d030 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72  * Temp space for
1d040 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76   pIdxKey - to av
1d050 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a  oid a malloc */.
1d060 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1d070 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
1d080 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1d090 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
1d0a0 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c  nfo, nKey, pKey,
1d0b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0d0 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
1d0e0 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
1d0f0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
1d100 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1d110 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
1d120 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
1d130 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
1d140 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
1d150 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
1d160 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
1d170 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
1d180 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  ( pKey ){.    sq
1d190 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
1d1a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49  npackedRecord(pI
1d1b0 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  dxKey);.  }.  re
1d1c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1d1d0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1d1e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1d1f0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
1d200 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
1d210 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
1d220 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
1d230 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
1d240 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
1d250 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
1d260 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
1d270 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
1d280 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
1d290 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
1d2a0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
1d2b0 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
1d2c0 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
1d2d0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1d2e0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1d2f0 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
1d300 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
1d310 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
1d320 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
1d330 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1d340 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
1d350 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
1d360 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
1d370 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
1d380 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
1d390 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
1d3a0 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
1d3b0 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
1d3c0 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
1d3d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
1d3e0 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
1d3f0 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
1d400 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1d410 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1d420 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20  on handle for a 
1d430 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74  cursor..*/.sqlit
1d440 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  e3 *sqlite3Btree
1d450 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42  CursorDb(const B
1d460 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1d470 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d480 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1d490 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1d4a0 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
1d4b0 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  n pCur->pBtree->
1d4c0 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  db;.}../*.** Adv
1d4d0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
1d4e0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
1d4f0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1d500 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
1d510 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
1d520 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
1d530 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
1d540 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
1d550 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1d560 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1d570 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
1d580 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1d590 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
1d5a0 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
1d5b0 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
1d5c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1d5d0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1d5e0 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
1d5f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1d600 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d610 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d620 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1d630 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1d640 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1d650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d670 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65   }.  assert( pRe
1d680 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55  s!=0 );.  if( CU
1d690 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1d6a0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1d6b0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1d6c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d6d0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
1d6e0 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20 20  r->skip>0 ){.   
1d6f0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1d700 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1d710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d720 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1d730 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70  ->skip = 0;..  p
1d740 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1d750 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1d760 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
1d770 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1d780 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
1d790 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1d7a0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d  .  assert( idx<=
1d7b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1d7c0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1d7d0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1d7e0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1d7f0 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
1d800 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
1d810 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1d820 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
1d830 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1d840 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1d850 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1d860 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
1d870 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1d880 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63  urn rc;.      rc
1d890 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
1d8a0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  t(pCur);.      *
1d8b0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1d8c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d8d0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
1d8e0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
1d8f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
1d900 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
1d910 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1d920 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1d930 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1d940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1d950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1d960 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
1d970 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
1d980 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1d990 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
1d9a0 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
1d9b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1d9c0 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  age]>=pPage->nCe
1d9d0 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ll );.    *pRes 
1d9e0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
1d9f0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1da00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1da10 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
1da20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1da30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1da40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1da50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1da60 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
1da70 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1da80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1da90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
1daa0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1dab0 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
1dac0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1dad0 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
1dae0 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
1daf0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
1db00 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1db10 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1db20 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1db30 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1db40 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1db50 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1db60 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1db70 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1db80 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1db90 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1dba0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1dbb0 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
1dbc0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
1dbd0 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
1dbe0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1dbf0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1dc00 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1dc10 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1dc20 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1dc30 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1dc40 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1dc50 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1dc60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1dc70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1dc80 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
1dc90 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1dca0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1dcb0 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1dcc0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1dcd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1dce0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1dcf0 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p<0 ){.    pCur-
1dd00 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1dd10 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1dd20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dd30 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1dd40 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
1dd50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1dd60 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
1dd70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1dd80 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
1dd90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1dda0 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
1ddb0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ddc0 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
1ddd0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1dde0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1ddf0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
1de00 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1de10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1de20 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1de30 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1de40 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
1de50 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
1de60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1de70 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
1de80 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
1de90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
1dea0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1deb0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
1dec0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1ded0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1dee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1def0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1df00 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
1df10 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
1df20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1df30 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1df40 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1df50 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1df60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
1df70 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
1df80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1df90 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
1dfa0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1dfb0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1dfc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1dfd0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
1dfe0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
1dff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1e000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e010 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73     }.  }.  *pRes
1e020 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1e030 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
1e040 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
1e050 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e060 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
1e070 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
1e080 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
1e090 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
1e0a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e0b0 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
1e0c0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
1e0d0 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
1e0e0 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
1e0f0 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
1e100 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
1e110 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
1e120 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
1e130 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
1e140 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
1e150 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
1e160 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
1e170 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
1e180 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e190 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
1e1a0 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
1e1b0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1e1c0 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
1e1d0 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e  ppPage and *pPgn
1e1e0 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  o are undefined 
1e1f0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
1e200 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20  an error..** Do 
1e210 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  not invoke sqlit
1e220 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
1e230 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20  n *ppPage if an 
1e240 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1e250 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1e260 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
1e270 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
1e280 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66  n a (feeble) eff
1e290 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
1e2a0 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
1e2b0 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
1e2c0 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
1e2d0 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
1e2e0 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
1e2f0 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
1e300 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
1e310 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
1e320 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e330 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
1e340 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
1e350 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
1e360 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
1e370 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61  f the "exact" pa
1e380 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1e390 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e  , and the page-n
1e3a0 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69  umber nearby exi
1e3b0 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65  sts .** anywhere
1e3c0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1e3d0 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
1e3e0 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72  arenteed to be r
1e3f0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
1e400 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
1e410 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1e420 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f  abases when allo
1e430 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  cating a new tab
1e440 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1e450 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
1e460 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1e470 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65  *pBt, .  MemPage
1e480 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67   **ppPage, .  Pg
1e490 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67  no *pPgno, .  Pg
1e4a0 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20  no nearby,.  u8 
1e4b0 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  exact.){.  MemPa
1e4c0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
1e4d0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20  t rc;.  int n;  
1e4e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e4f0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1e500 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b  elist */.  int k
1e510 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1e520 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
1e530 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
1e540 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
1e550 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
1e560 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
1e570 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61  vTrunk = 0;..  a
1e580 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e590 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1e5a0 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
1e5b0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1e5c0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
1e5d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e5e0 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29  6]);.  if( n>0 )
1e5f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
1e600 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
1e610 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
1e620 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
1e630 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
1e640 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
1e650 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
1e660 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
1e670 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
1e680 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
1e690 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
1e6a0 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20   If the 'exact' 
1e6b0 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72  parameter was tr
1e6c0 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  ue and a query o
1e6d0 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
1e6e0 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
1e6f0 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
1e700 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
1e710 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
1e720 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
1e730 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
1e740 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
1e750 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
1e760 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
1e770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1e780 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
1e790 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d  xact && nearby<=
1e7a0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1e7b0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
1e7c0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
1e7d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
1e7e0 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  rby>0 );.      a
1e7f0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
1e800 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
1e810 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1e820 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
1e830 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pe, 0);.      if
1e840 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e850 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1e860 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1e870 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  GE ){.        se
1e880 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
1e890 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67      }.      *pPg
1e8a0 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20  no = nearby;.   
1e8b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1e8c0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1e8d0 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
1e8e0 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
1e8f0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1e900 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
1e910 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
1e920 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
1e930 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
1e940 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
1e950 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e960 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1e970 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e980 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e990 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1e9a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1e9b0 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
1e9c0 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
1e9d0 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
1e9e0 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
1e9f0 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
1ea00 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
1ea10 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
1ea20 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
1ea30 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
1ea40 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
1ea50 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
1ea60 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
1ea70 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
1ea80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
1ea90 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
1eaa0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
1eab0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
1eac0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
1ead0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1eae0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1eaf0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
1eb00 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
1eb10 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1eb20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1eb30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1eb40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1eb50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1eb60 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
1eb70 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1eb80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
1eb90 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1eba0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ebb0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
1ebc0 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
1ebd0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1ebe0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
1ebf0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
1ec00 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
1ec10 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
1ec20 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
1ec30 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
1ec40 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
1ec50 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
1ec60 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
1ec70 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
1ec80 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
1ec90 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
1eca0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
1ecb0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1ecc0 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
1ecd0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1ece0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ecf0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1ed00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1ed10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1ed20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1ed30 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1ed40 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
1ed50 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
1ed60 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1ed70 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
1ed80 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1ed90 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
1eda0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1edb0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1edc0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
1edd0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1ede0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
1edf0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
1ee00 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
1ee10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
1ee20 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
1ee30 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
1ee40 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
1ee50 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
1ee60 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
1ee70 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1ee80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1ee90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1eea0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1eeb0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
1eec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1eed0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1eee0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
1eef0 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
1ef00 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
1ef10 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
1ef20 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
1ef30 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
1ef40 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
1ef50 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
1ef60 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
1ef70 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
1ef80 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
1ef90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1efa0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
1efb0 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
1efc0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1efd0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
1efe0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1eff0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f000 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1f010 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1f020 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1f030 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1f040 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1f050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f060 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
1f070 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1f080 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1f090 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f0a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f0b0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1f0c0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1f0d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f0e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1f0f0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
1f100 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
1f110 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1f120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f140 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
1f150 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
1f160 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
1f170 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
1f180 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
1f190 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
1f1a0 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
1f1b0 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
1f1c0 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
1f1d0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
1f1e0 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
1f1f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
1f200 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
1f210 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
1f220 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
1f230 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1f240 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
1f250 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f260 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1f270 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
1f280 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
1f290 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1f2a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f2b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1f2c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1f2d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f2e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f2f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
1f300 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
1f310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1f340 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1f350 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1f360 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1f370 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1f380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f390 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
1f3a0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
1f3b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1f3c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
1f3d0 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
1f3e0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
1f3f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
1f400 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
1f410 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
1f420 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
1f430 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
1f440 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1f450 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1f460 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
1f470 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1f480 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1f490 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1f4a0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1f4b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f4c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f4d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f4e0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
1f4f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f500 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f510 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1f520 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1f530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1f540 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1f550 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1f560 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
1f570 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1f580 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1f590 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
1f5a0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
1f5b0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
1f5c0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
1f5d0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
1f5e0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
1f5f0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
1f600 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
1f610 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
1f620 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
1f630 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73 74       int closest
1f640 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
1f650 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
1f660 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
1f670 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
1f680 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ta;.        rc =
1f690 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f6a0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1f6b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1f6c0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1f6d0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1f6e0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1f6f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
1f700 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
1f710 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73 74       int i, dist
1f720 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
1f730 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1f740 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79     dist = get4by
1f750 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
1f760 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
1f770 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64    if( dist<0 ) d
1f780 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20  ist = -dist;.   
1f790 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
1f7a0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
1f7b0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
1f7c0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1f7d0 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
1f7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1f7f0 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64  ( d2<0 ) d2 = -d
1f800 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  2;.            i
1f810 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
1f820 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
1f830 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
1f840 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
1f850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1f860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f880 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
1f890 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1f8a0 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
1f8b0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
1f8c0 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
1f8d0 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
1f8e0 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65  ist || iPage==ne
1f8f0 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
1f900 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20    int nPage;.   
1f910 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
1f920 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
1f930 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61   nPage = pagerPa
1f940 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1f950 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
1f960 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65  if( *pPgno>nPage
1f970 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f980 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66  /* Free page off
1f990 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1f9a0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
1f9b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f9c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f9d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1f9e0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1f9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1fa00 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1fa10 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
1fa20 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
1fa30 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
1fa50 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
1fa60 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
1fa70 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
1fa80 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
1fa90 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
1faa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1fab0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1fad0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
1fae0 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
1faf0 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
1fb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1fb10 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
1fb20 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
1fb30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fb40 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1fb50 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
1fb60 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 1);.         
1fb70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fb80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1fb90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
1fba0 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50  ntRollback((*ppP
1fbb0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1fbd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fbe0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
1fbf0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1fc00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fc10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fc20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1fc30 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
1fc40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fc50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1fc60 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1fc70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fc80 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
1fc90 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1fca0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
1fcb0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
1fcc0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
1fcd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1fce0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
1fcf0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1fd00 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
1fd10 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
1fd20 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
1fd30 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
1fd40 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65  int nPage = page
1fd50 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1fd60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 2a 70 50  pPager);.    *pP
1fd70 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b  gno = nPage + 1;
1fd80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fd90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fda0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  .    if( pBt->nT
1fdb0 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  runc ){.      /*
1fdc0 20 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20   An incr-vacuum 
1fdd0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
1fde0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
1fdf0 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a  saction. So the.
1fe00 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f        ** page to
1fe10 20 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74   allocate is not
1fe20 20 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63   from the physic
1fe30 61 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  al end of the fi
1fe40 6c 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  le, but.      **
1fe50 20 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e   at pBt->nTrunc.
1fe60 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1fe70 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
1fe80 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69  Trunc+1;.      i
1fe90 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
1fea0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1feb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70  ) ){.        (*p
1fec0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d  Pgno)++;.      }
1fed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1fee0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
1fef0 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
1ff00 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a  pBt, *pPgno) ){.
1ff10 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
1ff20 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
1ff30 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
1ff40 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
1ff50 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
1ff60 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1ff70 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
1ff80 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
1ff90 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
1ffa0 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
1ffb0 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
1ffc0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
1ffd0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
1ffe0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
1fff0 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45    */.      TRACE
20000 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
20010 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
20020 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
20030 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ge)\n", *pPgno))
20040 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20050 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
20060 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20070 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
20080 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  ++;.      if( *p
20090 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
200a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
200b0 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20  (*pPgno)++; }.  
200c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
200d0 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20  >nTrunc ){.     
200e0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a   pBt->nTrunc = *
200f0 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e  pPgno;.    }.#en
20100 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28  dif..    assert(
20110 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
20120 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
20130 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
20140 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
20150 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
20160 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
20170 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20180 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20190 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
201a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
201b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
201c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
201d0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
201e0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
201f0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
20200 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
20210 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
20220 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
20230 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
20240 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
20250 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
20260 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
20270 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
20280 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
20290 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
202a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
202b0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
202c0 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
202d0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
202e0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
202f0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
20300 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20310 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20320 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20330 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61  ../*.** Add a pa
20340 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
20350 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66  se file to the f
20360 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73  reelist..**.** s
20370 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
20380 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64  () is NOT called
20390 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
203a0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
203b0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
203c0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
203d0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
203e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
203f0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
20400 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20  1;.  int rc, n, 
20410 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65  k;..  /* Prepare
20420 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72   the page for fr
20430 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72  eeing */.  asser
20440 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20450 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
20460 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
20470 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
20480 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  o>1 );.  pPage->
20490 69 73 49 6e 69 74 20 3d 20 30 3b 0a 0a 20 20 2f  isInit = 0;..  /
204a0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
204b0 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
204c0 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
204d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
204e0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
204f0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
20500 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20510 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
20520 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
20530 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
20540 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
20550 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53   n+1);..#ifdef S
20560 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
20570 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ETE.  /* If the 
20580 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
20590 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  LETE compile-tim
205a0 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
205b0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  led, then.  ** a
205c0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
205d0 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
205e0 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
205f0 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  eros..  */.  rc 
20600 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20610 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
20620 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
20630 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
20640 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
20650 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
20660 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64  >pageSize);.#end
20670 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
20680 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
20690 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
206a0 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
206b0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
206c0 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
206d0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
206e0 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
206f0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
20700 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
20710 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67  mapPut(pBt, pPag
20720 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  e->pgno, PTRMAP_
20730 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20  FREEPAGE, 0);.  
20740 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20750 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
20760 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20   n==0 ){.    /* 
20770 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  This is the firs
20780 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a 20  t free page */. 
20790 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
207a0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
207b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
207c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
207d0 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  c;.    memset(pP
207e0 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 38  age->aData, 0, 8
207f0 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
20800 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20810 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  2], pPage->pgno)
20820 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 46 52  ;.    TRACE(("FR
20830 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72 73  EE-PAGE: %d firs
20840 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  t\n", pPage->pgn
20850 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o));.  }else{.  
20860 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65 20    /* Other free 
20870 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 65 78  pages already ex
20880 69 73 74 2e 20 20 52 65 74 72 69 76 65 20 74 68  ist.  Retrive th
20890 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  e first trunk pa
208a0 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ge.    ** of the
208b0 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66 69   freelist and fi
208c0 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  nd out how many 
208d0 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e 20 2a  leaves it has. *
208e0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
208f0 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d 20  Trunk;.    rc = 
20900 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
20910 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
20920 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
20930 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c 20  [32]), &pTrunk, 
20940 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
20950 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20960 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
20970 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
20980 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74 2d  .    if( k>=pBt-
20990 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
209a0 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  8 ){.      /* Th
209b0 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c 2e  e trunk is full.
209c0 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65 20    Turn the page 
209d0 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74 6f  being freed into
209e0 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20   a new.      ** 
209f0 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68 20  trunk page with 
20a00 6e 6f 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  no leaves..     
20a10 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
20a20 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
20a30 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
20a40 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
20a50 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
20a60 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
20a70 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
20a80 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
20a90 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
20aa0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
20ab0 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
20ac0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
20ad0 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
20ae0 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
20af0 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
20b00 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
20b10 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
20b20 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
20b30 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
20b40 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
20b50 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
20b60 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
20b70 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
20b80 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
20b90 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
20ba0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
20bb0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
20bc0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
20bd0 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
20be0 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20  ain to restrict 
20bf0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
20c00 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
20c10 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
20c20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
20c30 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
20c40 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
20c50 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
20c60 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
20c70 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
20c80 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
20c90 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
20ca0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
20cb0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
20cc0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
20cd0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
20ce0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
20cf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
20d00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20d10 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
20d20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
20d30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20d40 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
20d50 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
20d60 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a   pTrunk->pgno);.
20d70 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
20d80 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
20d90 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
20da0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
20db0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67  >aData[32], pPag
20dc0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
20dd0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
20de0 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
20df0 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
20e00 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
20e10 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
20e20 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  gno, pTrunk->pgn
20e30 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
20e40 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30 20 29   }else if( k<0 )
20e50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
20e60 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
20e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
20e80 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66   Add the newly f
20e90 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20 6c  reed page as a l
20ea0 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65  eaf on the curre
20eb0 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  nt trunk */.    
20ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20ed0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
20ee0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
20ef0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20f00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
20f10 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
20f20 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a  aData[4], k+1);.
20f30 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
20f40 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
20f50 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70  8+k*4], pPage->p
20f60 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
20f70 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
20f80 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  TE.        rc = 
20f90 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
20fa0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
20fb0 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
20fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
20fd0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
20fe0 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
20ff0 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
21000 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
21010 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
21020 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
21030 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unk);.  }.  retu
21040 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21050 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
21060 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
21070 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
21080 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
21090 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
210a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
210b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
210c0 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
210d0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
210e0 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
210f0 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
21100 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
21110 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
21120 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  int ovflPageSize
21130 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
21140 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21150 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
21160 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
21170 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
21180 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
21190 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
211a0 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
211b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
211c0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
211d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
211e0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
211f0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
21200 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
21210 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
21220 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
21230 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
21240 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
21250 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
21260 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
21270 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
21280 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
21290 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
212a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c  ;.  assert( ovfl
212b0 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c  Pgno==0 || nOvfl
212c0 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  >0 );.  while( n
212d0 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65  Ovfl-- ){.    Me
212e0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20  mPage *pOvfl;.  
212f0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d    if( ovflPgno==
21300 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61  0 || ovflPgno>pa
21310 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
21320 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
21330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21340 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21350 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67     }..    rc = g
21360 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
21370 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
21380 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29  Ovfl, (nOvfl==0)
21390 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  ?0:&ovflPgno);. 
213a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
213b0 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
213c0 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
213d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
213e0 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
213f0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
21400 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
21410 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
21420 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21430 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
21440 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
21450 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
21460 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
21470 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
21480 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
21490 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
214a0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
214b0 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
214c0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
214d0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
214e0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
214f0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
21500 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
21510 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
21520 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
21530 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
21540 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
21550 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
21560 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
21570 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
21580 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
21590 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
215a0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
215b0 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
215c0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
215d0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
215e0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
215f0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
21600 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
21610 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
21620 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
21630 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
21640 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
21650 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
21660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
21670 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
21680 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
21690 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
216a0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
216b0 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
216c0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
216d0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
216e0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
216f0 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
21700 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
21710 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
21720 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
21730 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21750 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
21760 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
21770 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
21780 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
21790 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
217a0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
217b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
217c0 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
217d0 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
217e0 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
217f0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
21800 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
21810 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
21820 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
21830 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
21840 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
21850 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
21860 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21870 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
21880 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
21890 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
218a0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
218b0 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
218c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
218d0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
218e0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  tex) );..  /* Fi
218f0 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
21900 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
21910 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
21920 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
21930 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
21940 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
21950 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
21960 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
21970 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
21980 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
21990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
219a0 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
219b0 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
219c0 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
219d0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
219e0 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c  4*)&nKey);.  sql
219f0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
21a00 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
21a10 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
21a20 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
21a30 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
21a40 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
21a50 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
21a60 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
21a70 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b  ==nData+nZero );
21a80 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
21a90 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
21aa0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
21ab0 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
21ac0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
21ad0 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
21ae0 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
21af0 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
21b00 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
21b10 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     nPayload += n
21b20 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
21b30 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
21b40 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e   nKey;.  }.  *pn
21b50 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
21b60 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
21b70 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
21b80 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
21b90 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
21ba0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
21bb0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
21bc0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
21bd0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
21be0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  paceLeft==0 ){. 
21bf0 20 20 20 20 20 69 6e 74 20 69 73 45 78 61 63 74       int isExact
21c00 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
21c10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21c20 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
21c30 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
21c40 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
21c50 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
21c60 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
21c70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
21c80 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
21c90 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
21ca0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
21cb0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
21cc0 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
21cd0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
21ce0 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
21cf0 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
21d00 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
21d10 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21d20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31    if( pgnoOvfl>1
21d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
21d40 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f   isExact = 1; */
21d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21d60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
21d70 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
21d80 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
21d90 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
21da0 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63 74  gnoOvfl, isExact
21db0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
21dc0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
21dd0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
21de0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
21df0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
21e00 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
21e10 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
21e20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
21e30 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
21e40 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
21e50 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
21e60 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
21e70 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
21e80 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
21e90 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
21ea0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
21eb0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
21ec0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
21ed0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
21ee0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
21ef0 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
21f00 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
21f10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
21f20 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
21f30 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
21f40 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
21f50 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
21f60 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
21f70 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
21f80 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
21f90 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
21fa0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
21fb0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
21fc0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21fd0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
21fe0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
21ff0 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
22000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22010 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
22020 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
22030 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
22040 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
22050 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
22060 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
22070 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
22080 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  rmap);.        i
22090 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
220a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
220b0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
220c0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
220d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
220e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
220f0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
22100 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
22110 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
22120 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
22130 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
22140 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22150 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
22160 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
22170 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
22180 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
22190 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
221a0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
221b0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
221c0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
221d0 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
221e0 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
221f0 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
22200 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
22210 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
22220 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
22230 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53  Left;.    if( nS
22240 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
22250 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
22260 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
22270 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
22280 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
22290 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
222a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
222b0 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
222c0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
222d0 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
222e0 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
222f0 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
22300 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
22310 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
22320 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
22330 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
22340 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
22350 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
22360 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
22370 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
22380 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22390 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
223a0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
223b0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
223c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
223d0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
223e0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
223f0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
22400 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
22410 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
22420 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
22430 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
22440 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
22450 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
22460 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
22470 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
22480 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
22490 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
224a0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
224b0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
224c0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
224d0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
224e0 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  t dropCell(MemPa
224f0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
22500 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  dx, int sz){.  i
22510 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
22520 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22530 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
22540 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
22550 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
22560 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
22570 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
22580 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
22590 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
225a0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
225b0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
225c0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
225d0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61  n data[] */..  a
225e0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
225f0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
22600 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
22610 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
22620 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
22630 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
22640 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
22650 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
22660 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22670 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
22680 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
22690 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
226a0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
226b0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
226c0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
226d0 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
226e0 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 20 28  yte(ptr);.  if (
226f0 20 70 63 3c 3d 31 30 20 7c 7c 20 70 63 2b 73 7a   pc<=10 || pc+sz
22700 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
22710 62 6c 65 53 69 7a 65 20 29 20 7b 0a 20 20 20 20  bleSize ) {.    
22720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22730 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
22740 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67    freeSpace(pPag
22750 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f  e, pc, sz);.  fo
22760 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
22770 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
22780 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
22790 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
227a0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
227b0 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
227c0 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
227d0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
227e0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
227f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
22800 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
22810 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  2;.  return SQLI
22820 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22830 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
22840 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
22850 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
22860 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
22870 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
22880 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
22890 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
228a0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
228b0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
228c0 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
228d0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
228e0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
228f0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
22900 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
22910 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
22920 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
22930 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
22940 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
22950 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
22960 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
22970 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
22980 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
22990 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
229a0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
229b0 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
229c0 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
229d0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
229e0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
229f0 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
22a00 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
22a10 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
22a20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
22a30 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
22a40 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
22a50 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
22a60 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
22a70 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
22a80 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
22a90 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
22aa0 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
22ab0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
22ac0 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
22ad0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
22ae0 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
22af0 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
22b00 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
22b10 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
22b20 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
22b30 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
22b40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
22b50 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
22b60 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
22b70 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
22b80 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
22b90 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
22ba0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
22bb0 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
22bc0 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
22bd0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
22be0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
22bf0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
22c00 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
22c10 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
22c20 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
22c30 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
22c40 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
22c50 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
22c60 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
22c70 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
22c80 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20    u8 nSkip      
22c90 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72      /* Do not wr
22ca0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53  ite the first nS
22cb0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
22cc0 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   cell */.){.  in
22cd0 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
22ce0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
22cf0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
22d00 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
22d10 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
22d20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
22d30 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ter */.  int top
22d40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
22d50 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74  rst byte of cont
22d60 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c  ent for any cell
22d70 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
22d80 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
22d90 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
22da0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
22db0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
22dc0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
22dd0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
22de0 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
22df0 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
22e00 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
22e10 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  d */.  int hdr; 
22e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
22e30 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f  et into data[] o
22e40 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
22e50 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  r */.  int cellO
22e60 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
22e70 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
22e80 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
22e90 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
22ea0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
22eb0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
22ec0 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
22ed0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
22ee0 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
22ef0 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
22f00 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
22f10 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
22f20 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
22f30 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
22f40 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
22f50 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
22f60 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
22f70 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
22f80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22f90 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
22fa0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
22fb0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
22fc0 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
22fd0 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
22fe0 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
22ff0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
23000 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
23010 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
23020 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
23030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
23040 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
23050 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
23060 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  j<sizeof(pPage->
23070 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
23080 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29  age->aOvfl[0]) )
23090 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
230a0 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
230b0 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
230c0 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69  aOvfl[j].idx = i
230d0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
230e0 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
230f0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
23100 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23110 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
23120 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23150 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
23160 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
23170 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
23180 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
23190 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
231a0 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
231b0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
231c0 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
231d0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
231e0 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
231f0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
23200 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
23210 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
23220 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20  e->nCell + 2;.  
23230 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
23240 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66  et + 2*i;.    if
23250 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a  ( end > top - sz
23260 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64   ){.      rc = d
23270 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
23280 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
23290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
232a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
232b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
232c0 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
232d0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
232e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e        assert( en
232f0 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b  d + sz <= top );
23300 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d  .    }.    idx =
23310 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
23320 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61  Page, sz);.    a
23330 73 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a  ssert( idx>0 );.
23340 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
23350 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74  <= get2byte(&dat
23360 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20  a[hdr+5]) );.   
23370 20 69 66 20 28 69 64 78 2b 73 7a 20 3e 20 70 50   if (idx+sz > pP
23380 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
23390 53 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 72 65  Size) {.      re
233a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
233b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
233c0 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
233d0 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
233e0 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d  Free -= 2;.    m
233f0 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
23400 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
23410 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
23420 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c      for(j=end-2,
23430 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
23440 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
23450 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
23460 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
23470 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
23480 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
23490 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
234a0 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
234b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
234c0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
234d0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
234e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
234f0 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
23500 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
23510 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
23520 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
23530 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
23540 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
23550 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
23560 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
23570 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
23580 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
23590 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
235a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c      */.      Cel
235b0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
235c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
235d0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
235e0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
235f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23600 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
23610 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
23620 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
23630 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20  ayload );.      
23640 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
23650 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
23660 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
23670 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
23680 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
23690 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
236a0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
236b0 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ow]);.        rc
236c0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61   = ptrmapPut(pPa
236d0 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66  ge->pBt, pgnoOvf
236e0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
236f0 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
23700 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23710 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
23720 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
23730 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
23740 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
23750 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23760 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
23770 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
23780 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
23790 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
237a0 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
237b0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
237c0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
237d0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
237e0 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
237f0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
23800 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
23810 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
23820 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
23830 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
23840 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
23850 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
23860 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
23870 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
23880 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
23890 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
238a0 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
238b0 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
238c0 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
238d0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
238e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
238f0 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
23900 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69  ;    /* Total si
23910 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
23920 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
23930 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
23940 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
23950 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b  /.  int cellptr;
23960 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
23970 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
23980 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
23990 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
239a0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
239b0 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
239c0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
239d0 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65   /* Data for the
239e0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
239f0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
23a00 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
23a10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23a20 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
23a30 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
23a40 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
23a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
23a60 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
23a70 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
23a80 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
23a90 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
23aa0 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
23ab0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
23ac0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
23ad0 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50  ;.  cellptr = pP
23ae0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
23af0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
23b00 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
23b10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
23b20 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
23b30 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
23b40 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29  );.  if( nCell )
23b50 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d  {.    cellbody =
23b60 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
23b70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29  Page, totalSize)
23b80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  ;.    assert( ce
23b90 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20  llbody>0 );.    
23ba0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
23bb0 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20  Free >= 2*nCell 
23bc0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
23bd0 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a  ree -= 2*nCell;.
23be0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
23bf0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
23c00 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
23c10 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62  [cellptr], cellb
23c20 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ody);.      memc
23c30 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
23c40 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
23c50 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Size[i]);.      
23c60 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  cellptr += 2;.  
23c70 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20      cellbody += 
23c80 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a  aSize[i];.    }.
23c90 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
23ca0 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74  body==pPage->pBt
23cb0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
23cc0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
23cd0 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  ll = nCell;.}../
23ce0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
23cf0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
23d00 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
23d10 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
23d20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
23d30 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
23d40 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
23d50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
23d60 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
23d70 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
23d80 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
23d90 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
23da0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
23db0 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
23dc0 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
23dd0 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
23de0 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
23df0 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
23e00 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
23e10 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
23e20 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
23e30 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
23e40 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
23e50 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
23e60 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
23e70 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
23e80 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
23e90 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
23ea0 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
23eb0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
23ec0 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
23ed0 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
23ee0 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
23ef0 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
23f00 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
23f10 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
23f20 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
23f30 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
23f40 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23f60 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
23f70 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
23f80 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
23f90 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
23fa0 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
23fb0 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
23fc0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
23fd0 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
23fe0 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
23ff0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
24000 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a  Cursor*, int);..
24010 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24020 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
24030 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
24040 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
24050 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
24060 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
24070 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
24080 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
24090 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
240a0 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
240b0 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
240c0 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
240d0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
240e0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
240f0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
24100 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
24110 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
24120 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63  of trying balanc
24130 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
24140 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
24150 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
24160 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
24170 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
24180 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
24190 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
241a0 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
241b0 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
241c0 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
241d0 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
241e0 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
241f0 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
24200 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
24210 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
24220 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
24230 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
24240 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
24250 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
24260 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
24270 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
24280 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
24290 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
242a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
242b0 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
242c0 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
242d0 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
242e0 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
242f0 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
24300 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
24310 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
24320 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
24330 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
24340 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
24350 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  k(BtCursor *pCur
24360 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
24370 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30  emPage *pNew = 0
24380 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  ;.  Pgno pgnoNew
24390 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  ;.  u8 *pCell;. 
243a0 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43   u16 szCell;.  C
243b0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
243c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
243d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
243e0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 4d 65  ur->iPage];.  Me
243f0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d  mPage *pParent =
24400 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24410 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
24420 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
24430 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
24440 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50  t parentIdx = pP
24450 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20  arent->nCell;   
24460 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64  /* pParent new d
24470 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65  ivider cell inde
24480 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  x */.  int paren
24490 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
244a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
244b0 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20   of new divider 
244c0 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72  cell */.  u8 par
244d0 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20  entCell[64];    
244e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
244f0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
24500 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
24510 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
24520 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
24530 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
24540 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ) );..  /* Alloc
24550 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
24560 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66  Insert the overf
24570 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  low cell from pP
24580 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74  age.  ** into it
24590 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68  . Then remove th
245a0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
245b0 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f  from pPage..  */
245c0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
245d0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
245e0 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
245f0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
24600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24610 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    pCell = pPage-
24620 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
24630 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65  .    szCell = ce
24640 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
24650 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7a 65 72   pCell);.    zer
24660 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67  oPage(pNew, pPag
24670 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  e->aData[0]);.  
24680 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
24690 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
246a0 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  &szCell);.    pP
246b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
246c0 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50   0;.  .    /* pP
246d0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
246e0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
246f0 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
24700 6e 67 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  nge this.    ** 
24710 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
24720 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
24730 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
24740 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20  d above and.    
24750 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
24760 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68  next-to-right ch
24770 69 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ild. .    **.   
24780 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72   ** Ignore the r
24790 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
247a0 68 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49  he call to fillI
247b0 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43  nCell(). fillInC
247c0 65 6c 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ell().    ** may
247d0 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68   only return oth
247e0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
247f0 4b 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69  K if it is requi
24800 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  red to allocate.
24810 20 20 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f      ** one or mo
24820 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
24830 73 2e 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65  s. Since an inte
24840 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65  rnal table B-Tre
24850 65 20 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d  e cell .    ** m
24860 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f  ay never spill o
24870 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72  ver onto an over
24880 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69 73  flow page (it is
24890 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20   a maximum of . 
248a0 20 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69     ** 13 bytes i
248b0 6e 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e  n size), it is n
248c0 6f 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f  ot neccessary to
248d0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
248e0 6e 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  n code..    **. 
248f0 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c     ** Similarly,
24900 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
24910 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  ) function canno
24920 74 20 66 61 69 6c 20 69 66 20 74 68 65 20 70 61  t fail if the pa
24930 67 65 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  ge.    ** being 
24940 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73  inserted into is
24950 20 61 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c   already writabl
24960 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64  e and the cell d
24970 6f 65 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20  oes not .    ** 
24980 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66  contain an overf
24990 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20  low pointer. So 
249a0 69 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75  ignore this retu
249b0 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20  rn code too..   
249c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
249d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
249e0 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ;.    pCell = fi
249f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
24a00 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
24a10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
24a20 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
24a30 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
24a40 3b 0a 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c  ;.    fillInCell
24a50 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
24a60 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
24a70 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
24a80 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61  rentSize);.    a
24a90 73 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a  ssert( parentSiz
24aa0 65 3c 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65  e<64 );.    asse
24ab0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
24ac0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
24ad0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
24ae0 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
24af0 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49  pParent, parentI
24b00 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20  dx, parentCell, 
24b10 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34  parentSize, 0, 4
24b20 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
24b30 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
24b40 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49  (pParent,parentI
24b50 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  dx), pPage->pgno
24b60 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
24b70 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
24b80 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
24b90 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
24ba0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
24bb0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
24bc0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
24bd0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
24be0 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
24bf0 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
24c00 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
24c10 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
24c20 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
24c30 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
24c40 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
24c50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
24c60 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
24c70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
24c80 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
24c90 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
24ca0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
24cb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
24cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24cd0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
24ce0 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30  pPutOvfl(pNew, 0
24cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24d00 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
24d10 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
24d20 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
24d30 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
24d40 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
24d50 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
24d60 74 20 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72  t the pPage->nFr
24d70 65 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  ee variable is n
24d80 6f 74 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  ot set correctly
24d90 20 77 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65   with.  ** respe
24da0 63 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ct to the conten
24db0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 28 62  t of the page (b
24dc0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 73 65  ecause it was se
24dd0 74 20 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20  t to 0 by .  ** 
24de0 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20  insertCell). So 
24df0 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65  call sqlite3Btre
24e00 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d  eInitPage() to m
24e10 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 0a 20  ake sure it is. 
24e20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   ** correct..  *
24e30 2a 0a 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20  *.  ** This has 
24e40 74 6f 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20  to be done even 
24e50 69 66 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c  if an error will
24e60 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f   be returned. No
24e70 72 6d 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20  rmally, if.  ** 
24e80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
24e90 64 75 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61  during tree bala
24ea0 6e 63 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65  ncing, the conte
24eb0 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61  nts of MemPage a
24ec0 72 65 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f  re.  ** not impo
24ed0 72 74 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77  rtant, as they w
24ee0 69 6c 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61  ill be recalcula
24ef0 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 61 67  ted when the pag
24f00 65 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  e is rolled.  **
24f10 20 62 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c   back. But here,
24f20 20 69 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63   in balance_quic
24f30 6b 28 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69  k(), it is possi
24f40 62 6c 65 20 74 68 61 74 20 70 50 61 67 65 20 68  ble that pPage h
24f50 61 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74  as .  ** not yet
24f60 20 62 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72   been marked dir
24f70 74 79 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e  ty or written in
24f80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
24f90 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20  ile. Therefore. 
24fa0 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   ** it will not 
24fb0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
24fc0 6e 64 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f  nd so it is impo
24fd0 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75  rtant to make su
24fe0 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
24ff0 20 70 61 67 65 20 64 61 74 61 20 61 6e 64 20 63   page data and c
25000 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61  ontents of MemPa
25010 67 65 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e  ge are consisten
25020 74 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d  t..  */.  pPage-
25030 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73  >isInit = 0;.  s
25040 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
25050 61 67 65 28 70 50 61 67 65 29 3b 0a 0a 20 20 2f  age(pPage);..  /
25060 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
25070 65 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c 20  else succeeded, 
25080 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
25090 6e 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20 2a  nt page, in .  *
250a0 2a 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64  * case the divid
250b0 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  er cell inserted
250c0 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65   caused it to be
250d0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20  come overfull.. 
250e0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
250f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
25100 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
25110 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  );.    pCur->iPa
25120 67 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20 62  ge--;.    rc = b
25130 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b  alance(pCur, 0);
25140 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25150 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
25160 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
25170 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALANCE */../*.**
25180 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
25190 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
251a0 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
251b0 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
251c0 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
251d0 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
251e0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
251f0 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
25200 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
25210 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
25220 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
25230 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
25240 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
25250 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
25260 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
25270 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
25280 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
25290 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
252a0 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
252b0 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
252c0 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
252d0 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
252e0 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
252f0 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
25300 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
25310 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
25320 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
25330 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
25340 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
25350 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
25360 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
25370 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
25380 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
25390 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
253a0 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
253b0 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
253c0 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
253d0 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
253e0 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
253f0 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
25400 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
25410 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
25420 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
25430 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
25440 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
25450 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
25460 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
25470 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
25480 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
25490 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
254a0 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
254b0 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
254c0 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
254d0 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
254e0 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
254f0 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
25500 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
25510 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25520 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
25530 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
25540 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
25550 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
25560 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
25570 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
25580 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
25590 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
255a0 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
255b0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
255c0 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
255d0 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
255e0 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
255f0 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
25600 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
25610 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
25620 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
25630 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
25640 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
25650 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
25660 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
25670 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
25680 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
25690 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
256a0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
256b0 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
256c0 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
256d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
256e0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
256f0 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
25700 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
25710 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
25720 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20  d state.  So if 
25730 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
25740 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
25750 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
25760 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
25770 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
25780 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73 6f  _nonroot(BtCurso
25790 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
257a0 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
257b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
257c0 6f 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75 6c  over or underful
257d0 6c 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e 63  l page to balanc
257e0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
257f0 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
25800 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
25810 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  t of pPage */.  
25820 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25840 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61  The whole databa
25850 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  se */.  int nCel
25860 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
25870 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25880 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
25890 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  l[] */.  int nMa
258a0 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20  xCells = 0;     
258b0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
258c0 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c  ed size of apCel
258d0 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d  l, szCell, aFrom
258e0 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b  . */.  int nOld;
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25900 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25910 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b   pages in apOld[
25920 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b  ] */.  int nNew;
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25950 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b   pages in apNew[
25960 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b  ] */.  int nDiv;
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25990 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b   cells in apDiv[
259a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ] */.  int i, j,
259b0 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
259c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
259d0 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ters */.  int id
259e0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
259f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25a00 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72  of pPage in pPar
25a10 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
25a20 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a40 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
25a50 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
25a60 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
25a70 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
25a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25a90 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
25aa0 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63    int leafCorrec
25ab0 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
25ac0 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
25ad0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
25ae0 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
25af0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
25b00 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
25b10 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
25b20 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
25b30 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
25b40 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
25b50 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
25b60 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
25b70 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
25b80 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
25b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
25ba0 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
25bb0 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
25bc0 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
25bd0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
25be0 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
25bf0 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
25c00 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
25c10 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
25c20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
25c30 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
25c40 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ce1[] */.  int i
25c50 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20  Space2 = 0;     
25c60 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
25c70 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
25c80 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69  aSpace2[] */.  i
25c90 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25cb0 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
25cc0 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
25cd0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
25ce0 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
25cf0 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
25d00 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
25d10 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
25d20 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
25d30 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
25d40 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
25d50 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
25d60 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
25d70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
25d80 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
25d90 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
25da0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
25db0 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
25dc0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
25dd0 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
25de0 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
25df0 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
25e00 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
25e10 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
25e20 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
25e30 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
25e40 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d  .  u8 *apDiv[NB]
25e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25e60 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
25e70 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
25e80 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
25e90 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
25ea0 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
25eb0 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
25ec0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
25ed0 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
25ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25ef0 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
25f00 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
25f10 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
25f20 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
25f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
25f40 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
25f50 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
25f60 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
25f70 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
25f80 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
25f90 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
25fa0 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e  */.  u8 *aCopy[N
25fb0 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  B];         /* S
25fc0 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67  pace for holding
25fd0 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b   data of apCopy[
25fe0 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
25ff0 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e1;           /*
26000 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
26010 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
26020 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e  lls before balan
26030 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  ce */.  u8 *aSpa
26040 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ce2 = 0;       /
26050 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72  * Space for over
26060 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65  flow dividers ce
26070 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  lls after balanc
26080 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d  e */.  u8 *aFrom
26090 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
260a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
260b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
260c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
260d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
260e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
260f0 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d   VVA_ONLY( pCur-
26100 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d  >pagesShuffled =
26110 20 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a   1 );..  /* .  *
26120 2a 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e  * Find the paren
26130 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
26140 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
26150 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
26160 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
26170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
26180 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26190 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
261a0 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  age) || pPage->n
261b0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
261c0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
261d0 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
261e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
261f0 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73  ->iPage-1];.  as
26200 73 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b  sert( pParent );
26210 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
26220 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
26230 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e  agerWrite(pParen
26240 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a  t->pDbPage)) ){.
26250 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26260 20 7d 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41   }..  TRACE(("BA
26270 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
26280 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
26290 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
262a0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
262b0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
262c0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
262d0 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ANCE.  /*.  ** A
262e0 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   special case:  
262f0 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68  If a new entry h
26300 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73  as just been ins
26310 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a  erted into a.  *
26320 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73  * table (that is
26330 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69  , a btree with i
26340 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20  nteger keys and 
26350 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20  all data at the 
26360 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64  leaves).  ** and
26370 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
26380 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
26390 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
263a0 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20  ee (it has the. 
263b0 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29   ** largest key)
263c0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70   then use the sp
263d0 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75  ecial balance_qu
263e0 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ick() routine fo
263f0 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67  r.  ** balancing
26400 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  .  balance_quick
26410 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65  () is much faste
26420 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e  r and results in
26430 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20   a tighter.  ** 
26440 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20  packing of data 
26450 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
26460 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
26470 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20  Page->leaf &&.  
26480 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
26490 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  y &&.      pPage
264a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26  ->nOverflow==1 &
264b0 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61  &.      pPage->a
264c0 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
264d0 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20  ge->nCell &&.   
264e0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f     pParent->pgno
264f0 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74  !=1 &&.      get
26500 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
26510 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
26520 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50  drOffset+8])==pP
26530 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20  age->pgno.  ){. 
26540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26550 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
26560 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20  /*.    ** TODO: 
26570 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e  Check the siblin
26580 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  gs to the left o
26590 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20  f pPage. It may 
265a0 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  be that.    ** t
265b0 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c  hey are not full
265c0 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65   and no new page
265d0 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
265e0 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
265f0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 43  balance_quick(pC
26600 75 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ur);.  }.#endif.
26610 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
26620 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
26630 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
26640 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20  >pDbPage)) ){.  
26650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
26660 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
26670 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65   the cell in the
26680 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f   parent page who
26690 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f  se left child po
266a0 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74  ints back.  ** t
266b0 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69  o pPage.  The "i
266c0 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20  dx" variable is 
266d0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
266e0 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67  t cell.  If pPag
266f0 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69  e.  ** is the ri
26700 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ghtmost child of
26710 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65   pParent then se
26720 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74  t idx to pParent
26730 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20  ->nCell .  */.  
26740 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
26750 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
26760 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
26770 49 6e 64 65 78 28 70 50 61 72 65 6e 74 2c 20 69  Index(pParent, i
26780 64 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  dx, pPage->pgno)
26790 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69  ;..  /*.  ** Ini
267a0 74 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65  tialize variable
267b0 73 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  s so that it wil
267c0 6c 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d  l be safe to jum
267d0 70 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20  p.  ** directly 
267e0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
267f0 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74  up at any moment
26800 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20  ..  */.  nOld = 
26810 6e 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a  nNew = 0;..  /*.
26820 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e    ** Find siblin
26830 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65  g pages to pPage
26840 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69   and the cells i
26850 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64  n pParent that d
26860 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73  ivide.  ** the s
26870 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74  iblings.  An att
26880 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
26890 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
268a0 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20   on either.  ** 
268b0 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20  side of pPage.  
268c0 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
268d0 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
268e0 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
268f0 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68  if.  ** pPage th
26900 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
26910 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
26920 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
26930 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  .  If pParent.  
26940 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
26950 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
26960 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
26970 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
26980 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76  en..  */.  nxDiv
26990 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69   = idx - NN;.  i
269a0 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20  f( nxDiv + NB > 
269b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
269c0 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50  {.    nxDiv = pP
269d0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e  arent->nCell - N
269e0 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  B + 1;.  }.  if(
269f0 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20   nxDiv<0 ){.    
26a00 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20  nxDiv = 0;.  }. 
26a10 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72   nDiv = 0;.  for
26a20 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69  (i=0, k=nxDiv; i
26a30 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a  <NB; i++, k++){.
26a40 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e      if( k<pParen
26a50 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
26a60 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
26a70 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b  dCell(pParent, k
26a80 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b  );.      nDiv++;
26a90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
26aa0 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b  pParent->leaf );
26ab0 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
26ac0 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  ] = get4byte(apD
26ad0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  iv[i]);.    }els
26ae0 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74  e if( k==pParent
26af0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
26b00 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
26b10 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
26b20 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
26b30 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
26b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26b60 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
26b70 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c  Page(pBt, pgnoOl
26b80 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  d[i], &apOld[i])
26b90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
26ba0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
26bb0 6e 75 70 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c  nup;.    /* apOl
26bc0 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20  d[i]->idxParent 
26bd0 3d 20 6b 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f  = k; */.    apCo
26be0 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61  py[i] = 0;.    a
26bf0 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29  ssert( i==nOld )
26c00 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20  ;.    nOld++;.  
26c10 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
26c20 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
26c30 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
26c40 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flow;.  }..  /* 
26c50 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
26c60 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
26c70 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
26c80 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
26c90 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
26ca0 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
26cb0 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
26cc0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
26cd0 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
26ce0 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
26cf0 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20   */.  szScratch 
26d00 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
26d10 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
26d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d30 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
26d40 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
26d50 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
26d80 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38  /.     + (ROUND8
26d90 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
26da0 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )+pBt->pageSize)
26db0 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f  *NB  /* aCopy */
26dc0 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
26dd0 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
26e00 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f  /.     + (ISAUTO
26e10 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c  VACUUM ? nMaxCel
26e20 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20  ls : 0);        
26e30 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f       /* aFrom */
26e40 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
26e50 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
26e60 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
26e70 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
26e80 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
26e90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
26ea0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26eb0 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
26ec0 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
26ed0 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
26ee0 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26  Copy[0] = (u8*)&
26ef0 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
26f00 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61  ];.  assert( ((a
26f10 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61  Copy[0] - (u8*)a
26f20 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
26f30 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
26f40 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
26f50 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  /.  for(i=1; i<N
26f60 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f  B; i++){.    aCo
26f70 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69  py[i] = &aCopy[i
26f80 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
26f90 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
26fa0 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20  MemPage))];.    
26fb0 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
26fc0 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  i] - (u8*)apCell
26fd0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
26fe0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
26ff0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d   required */.  }
27000 0a 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43  .  aSpace1 = &aC
27010 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
27020 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
27030 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
27040 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53  ;.  assert( ((aS
27050 70 61 63 65 31 20 2d 20 28 75 38 2a 29 61 70 43  pace1 - (u8*)apC
27060 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
27070 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
27080 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
27090 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
270a0 55 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20  UM ){.    aFrom 
270b0 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  = &aSpace1[pBt->
270c0 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20  pageSize];.  }. 
270d0 20 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74   aSpace2 = sqlit
270e0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74  e3PageMalloc(pBt
270f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
27100 66 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b  f( aSpace2==0 ){
27110 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
27120 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
27130 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
27140 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20  ;.  }.  .  /*.  
27150 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
27160 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
27170 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73   pPage and its s
27180 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c  iblings into aOl
27190 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  d[]..  ** The re
271a0 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
271b0 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
271c0 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
271d0 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68  s rather.  ** th
271e0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
271f0 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
27200 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
27210 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
27220 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
27230 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
27240 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
27250 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
27260 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
27270 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
27280 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a  Page*)aCopy[i];.
27290 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70      memcpy(p, ap
272a0 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
272b0 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d  emPage));.    p-
272c0 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
272d0 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  &p[1];.    memcp
272e0 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  y(p->aData, apOl
272f0 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
27300 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
27310 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
27320 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
27330 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
27340 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
27350 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
27360 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
27370 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
27380 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
27390 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
273a0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
273b0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72  ace obtained for
273c0 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
273d0 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
273e0 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
273f0 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
27400 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
27410 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
27420 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
27430 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
27440 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
27450 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
27460 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
27470 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
27480 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
27490 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
274a0 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
274b0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
274c0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
274d0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
274e0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
274f0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
27500 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
27510 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
27520 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
27530 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
27540 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
27550 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
27560 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
27570 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
27580 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
27590 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
275a0 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
275b0 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
275c0 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
275d0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
275e0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
275f0 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
27600 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
27610 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
27620 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
27630 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
27640 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
27650 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  ge->hasData;.  f
27660 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
27670 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
27680 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
27690 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
276a0 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
276b0 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
276c0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
276d0 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
276e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
276f0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
27700 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
27710 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
27720 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
27730 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
27740 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
27750 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
27760 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66  Cell]);.      if
27770 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
27780 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b  {.        int a;
27790 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e  .        aFrom[n
277a0 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20  Cell] = i;.     
277b0 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f     for(a=0; a<pO
277c0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61  ld->nOverflow; a
277d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
277e0 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61  f( pOld->aOvfl[a
277f0 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b  ].pCell==apCell[
27800 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20  nCell] ){.      
27810 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
27820 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
27830 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27850 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27860 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
27870 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
27880 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73  1 ){.      u16 s
27890 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
278a0 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
278b0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
278c0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
278d0 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45    /* With the LE
278e0 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61  AFDATA flag, pPa
278f0 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20  rent cells hold 
27900 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61  only INTKEYs tha
27910 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  t.        ** are
27920 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b   duplicates of k
27930 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  eys on the child
27940 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64   pages.  We need
27950 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20   to remove.     
27960 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65     ** the divide
27970 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61  r cells from pPa
27980 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69  rent, but the di
27990 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65  viders cells are
279a0 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
279b0 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b  added to apCell[
279c0 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  ] because they a
279d0 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
279e0 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20   child cells..  
279f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27a00 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
27a10 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
27a20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27a30 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
27a40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
27a50 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
27a60 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
27a70 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
27a80 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
27a90 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
27aa0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31  .        iSpace1
27ab0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
27ac0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
27ad0 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
27ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
27af0 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
27b00 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
27b10 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
27b20 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
27b30 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
27b40 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
27b50 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
27b60 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
27b70 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
27b80 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
27b90 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d   0xFF;.        }
27ba0 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
27bb0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
27bc0 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73  , sz);.        s
27bd0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20  zCell[nCell] -= 
27be0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
27bf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27c00 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d  get4byte(pTemp)=
27c10 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20  =pgnoOld[i] );. 
27c20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64         if( !pOld
27c30 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
27c40 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
27c50 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
27c60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
27c70 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20  e right pointer 
27c80 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
27c90 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74  e pOld becomes t
27ca0 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  he left.        
27cb0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
27cc0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
27cd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
27ce0 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
27cf0 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
27d00 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  [pOld->hdrOffset
27d10 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  +8], 4);.       
27d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27d30 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
27d40 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
27d50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43           if( szC
27d60 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
27d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27d80 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
27d90 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
27da0 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
27db0 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c             szCel
27dc0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20  l[nCell] = 4;.  
27dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27de0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c    }.        nCel
27df0 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l++;.      }.   
27e00 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
27e10 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
27e20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
27e30 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
27e40 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
27e50 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
27e60 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
27e70 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
27e80 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
27e90 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
27ea0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
27eb0 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
27ec0 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
27ed0 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
27ee0 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
27ef0 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
27f00 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
27f10 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
27f20 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
27f30 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
27f40 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
27f50 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
27f60 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
27f70 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
27f80 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
27f90 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
27fa0 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
27fb0 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
27fc0 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
27fd0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
27fe0 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
27ff0 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
28000 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
28010 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
28020 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
28030 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
28040 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
28050 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
28060 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
28070 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
28080 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
28090 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
280a0 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
280b0 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
280c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
280d0 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
280e0 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
280f0 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
28100 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
28110 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
28120 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
28130 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
28140 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
28150 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
28160 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
28170 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
28180 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
28190 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
281a0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
281b0 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
281c0 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
281d0 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
281e0 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
281f0 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
28200 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
28210 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
28220 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
28230 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
28240 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
28250 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
28260 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
28270 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
28280 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
28290 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
282a0 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
282b0 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
282c0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
282d0 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
282e0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
282f0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
28300 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
28310 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
28320 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
28330 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
28340 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
28350 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
28360 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
28370 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
28380 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
28390 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
283a0 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
283b0 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
283c0 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
283d0 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
283e0 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
283f0 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
28400 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
28410 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
28420 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
28430 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
28440 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
28450 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
28460 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
28470 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
28480 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
28490 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
284a0 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
284b0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
284c0 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
284d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
284e0 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
284f0 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
28500 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
28510 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
28520 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
28530 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
28540 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
28550 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
28560 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
28570 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
28580 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
28590 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
285a0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
285b0 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
285c0 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
285d0 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
285e0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
285f0 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
28600 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
28610 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
28620 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
28630 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
28640 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
28650 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
28660 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
28670 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
28680 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
28690 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
286a0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
286b0 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
286c0 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
286d0 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
286e0 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
286f0 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
28700 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20  ew[0])>0) or we 
28710 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76  are the.  ** a v
28720 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
28730 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
28740 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
28750 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
28760 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
28770 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
28780 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
28790 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
287a0 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
287b0 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
287c0 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
287d0 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
287e0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
287f0 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
28800 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
28810 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
28820 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
28830 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31  t( pPage->pgno>1
28840 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20   );.  pageFlags 
28850 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  = pPage->aData[0
28860 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
28870 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
28880 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
28890 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
288a0 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
288b0 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
288c0 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
288d0 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20   = pgnoOld[i];. 
288e0 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
288f0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
28900 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28910 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
28920 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
28930 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
28940 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28950 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
28960 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
28970 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
28980 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
28990 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
289a0 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77  oNew[i], pgnoNew
289b0 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  [i-1], 0);.     
289c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
289d0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
289e0 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
289f0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
28a00 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  w++;.    }.  }..
28a10 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
28a20 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
28a30 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
28a40 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
28a50 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
28a60 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
28a70 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
28a80 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
28a90 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28aa0 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
28ab0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
28ac0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
28ad0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
28ae0 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
28af0 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
28b00 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
28b10 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
28b20 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
28b30 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
28b40 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
28b50 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
28b60 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
28b70 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
28b80 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
28b90 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
28ba0 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
28bb0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
28bc0 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
28bd0 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
28be0 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
28bf0 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
28c00 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
28c10 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
28c20 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
28c30 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
28c40 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
28c50 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
28c60 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
28c70 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
28c80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
28c90 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
28ca0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
28cb0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
28cc0 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
28cd0 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
28ce0 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
28cf0 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
28d00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
28d10 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
28d20 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d  inV = pgnoNew[i]
28d30 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
28d40 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
28d50 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
28d60 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b      if( pgnoNew[
28d70 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  j]<(unsigned)min
28d80 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
28d90 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
28da0 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d  inV = pgnoNew[j]
28db0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28dc0 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
28dd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
28de0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
28df0 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f  ;.      t = pgno
28e00 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  New[i];.      pT
28e10 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
28e20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
28e30 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  pgnoNew[minI];. 
28e40 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
28e50 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
28e60 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d     pgnoNew[minI]
28e70 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65   = t;.      apNe
28e80 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
28e90 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
28ea0 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
28eb0 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25  %d %d %d  new: %
28ec0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
28ed0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
28ee0 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c  )\n",.    pgnoOl
28ef0 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  d[0], .    nOld>
28f00 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20  =2 ? pgnoOld[1] 
28f10 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
28f20 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20   ? pgnoOld[2] : 
28f30 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30  0,.    pgnoNew[0
28f40 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  ], szNew[0],.   
28f50 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e   nNew>=2 ? pgnoN
28f60 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[1] : 0, nNew>
28f70 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
28f80 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
28f90 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c   pgnoNew[2] : 0,
28fa0 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
28fb0 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
28fc0 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33  w>=4 ? pgnoNew[3
28fd0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  ] : 0, nNew>=4 ?
28fe0 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
28ff0 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e     nNew>=5 ? pgn
29000 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[4] : 0, nNe
29010 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
29020 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  : 0));..  /*.  *
29030 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
29040 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
29050 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
29060 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
29070 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
29080 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
29090 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
290a0 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
290b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
290c0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
290d0 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
290e0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
290f0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
29100 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
29110 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
29120 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
29130 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
29140 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20  gno==pgnoNew[i] 
29150 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
29160 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
29170 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
29180 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
29190 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
291a0 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
291b0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
291c0 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
291d0 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
291e0 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
291f0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
29200 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
29210 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
29220 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
29230 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
29240 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
29250 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  tries.    ** tha
29260 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  t point to the s
29270 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
29280 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68  e rearranged. Th
29290 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74  ese can be: left
292a0 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e  .    ** children
292b0 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72   of cells, the r
292c0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
292d0 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66  e page, or overf
292e0 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  low pages.    **
292f0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
29300 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ells..    */.   
29310 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
29320 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  M ){.      for(k
29330 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b  =j; k<cntNew[i];
29340 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   k++){.        a
29350 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c  ssert( k<nMaxCel
29360 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ls );.        if
29370 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46  ( aFrom[k]==0xFF
29380 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d   || apCopy[aFrom
29390 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  [k]]->pgno!=pNew
293a0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
293b0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
293c0 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a  utOvfl(pNew, k-j
293d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
293e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
293f0 26 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  & leafCorrection
29400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
29410 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
29420 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
29430 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d  apCell[k]), PTRM
29440 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
29450 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
29460 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
29470 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
29490 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
294a0 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
294b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
294c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d  }.    }..    j =
294d0 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
294e0 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
294f0 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
29500 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
29510 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
29520 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
29530 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
29540 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
29550 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
29560 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77  /.    if( i<nNew
29570 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b  -1 && j<nCell ){
29580 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
29590 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
295a0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
295b0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
295c0 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
295d0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
295e0 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
295f0 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
29600 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
29610 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
29620 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a  pace2[iSpace2];.
29630 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
29640 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
29650 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
29660 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
29670 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
29680 49 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20  ISAUTOVACUUM .  
29690 20 20 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d         && (aFrom
296a0 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43  [j]==0xFF || apC
296b0 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70  opy[aFrom[j]]->p
296c0 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29  gno!=pNew->pgno)
296d0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
296e0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
296f0 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
29700 74 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41  te(pCell), PTRMA
29710 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
29720 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
29730 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29740 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29750 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
29760 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
29770 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29780 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
29790 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
297a0 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
297b0 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
297c0 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
297d0 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
297e0 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
297f0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
29800 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
29810 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
29820 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
29830 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
29840 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
29850 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
29860 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
29870 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
29880 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
29890 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
298a0 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
298b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
298c0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
298d0 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
298e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
298f0 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61  eCellPtr(pNew, a
29900 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29  pCell[j], &info)
29910 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
29920 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = pTemp;.       
29930 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
29940 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69  ent, pCell, 0, i
29950 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
29960 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20  0, &sz);.       
29970 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
29980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29990 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
299a0 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
299b0 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
299c0 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
299d0 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
299e0 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
299f0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
29a00 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
29a10 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
29a20 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
29a30 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
29a40 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
29a50 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
29a60 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
29a70 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c       ** (see sql
29a80 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
29a90 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
29aa0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
29ab0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
29ac0 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
29ad0 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
29ae0 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
29af0 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
29b00 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
29b10 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
29b20 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
29b30 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29b40 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
29b50 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
29b60 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
29b70 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
29b80 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
29b90 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
29ba0 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
29bb0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
29bc0 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
29bd0 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
29be0 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
29bf0 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
29c00 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
29c10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
29c20 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
29c30 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
29c40 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
29c50 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
29c60 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
29c70 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
29c80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29c90 20 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61 63     }.      iSpac
29ca0 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  e2 += sz;.      
29cb0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
29cc0 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
29cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
29ce0 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ace2<=pBt->pageS
29cf0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ize );.      rc 
29d00 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
29d10 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
29d20 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34  ll, sz, pTemp, 4
29d30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
29d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
29d50 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29d60 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  p;.      put4byt
29d70 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
29d80 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76  ll(pParent,nxDiv
29d90 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  ), pNew->pgno);.
29da0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
29db0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
29dc0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e  uum database, an
29dd0 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74  d not a leaf-dat
29de0 61 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a  a tree,.      **
29df0 20 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65   then update the
29e00 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74   pointer map wit
29e10 68 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  h an entry for t
29e20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
29e30 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
29e40 68 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73  he cell just ins
29e50 65 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20  erted points to 
29e60 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20  (if any)..      
29e70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
29e80 55 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65  UTOVACUUM && !le
29e90 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
29ea0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29eb0 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Ovfl(pParent, nx
29ec0 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Div);.        if
29ed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
29ef0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29f00 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
29f10 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a     }.      j++;.
29f20 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
29f30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
29f40 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
29f50 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
29f60 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
29f70 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
29f80 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
29f90 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29fa0 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
29fb0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
29fc0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
29fd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29ff0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2a000 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2a010 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2a020 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
2a030 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
2a040 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
2a050 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
2a060 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
2a070 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
2a080 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
2a090 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
2a0a0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
2a0b0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
2a0c0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
2a0d0 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28  ild, 4);.    if(
2a0e0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2a0f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2a100 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
2a110 79 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52  yte(zChild), PTR
2a120 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
2a130 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
2a140 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2a150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a160 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2a170 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2a180 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2a190 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  ( nxDiv==pParent
2a1a0 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d  ->nCell+pParent-
2a1b0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2a1c0 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20    /* Right-most 
2a1d0 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72  sibling is the r
2a1e0 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
2a1f0 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  of pParent */.  
2a200 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
2a210 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2a220 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2a230 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
2a240 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
2a250 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
2a260 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65  ibling is the le
2a270 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ft child of the 
2a280 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70  first entry in p
2a290 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61  Parent.    ** pa
2a2a0 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  st the right-mos
2a2b0 74 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20  t divider entry 
2a2c0 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
2a2d0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2a2e0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
2a2f0 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31  , pgnoNew[nNew-1
2a300 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ]);.  }..  /*.  
2a310 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70  ** Balance the p
2a320 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74  arent page.  Not
2a330 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65  e that the curre
2a340 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20  nt page (pPage) 
2a350 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20  might.  ** have 
2a360 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68  been added to th
2a370 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74  e freelist so it
2a380 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72   might no longer
2a390 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
2a3a0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61  .  ** But the pa
2a3b0 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61  rent page will a
2a3c0 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c  lways be initial
2a3d0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ized..  */.  ass
2a3e0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
2a3f0 49 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74 65  Init );.  sqlite
2a400 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
2a410 65 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d  ell);.  apCell =
2a420 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
2a430 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72  e(pPage);.  pCur
2a440 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20  ->iPage--;.  rc 
2a450 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
2a460 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  0);.  .  /*.  **
2a470 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20   Cleanup before 
2a480 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  returning..  */.
2a490 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a  balance_cleanup:
2a4a0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
2a4b0 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73  ee(aSpace2);.  s
2a4c0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
2a4d0 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
2a4e0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2a4f0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2a500 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2a510 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2a520 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
2a530 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
2a540 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w[i]);.  }..  /*
2a550 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2a560 72 65 6e 74 29 3b 20 2a 2f 0a 20 20 54 52 41 43  rent); */.  TRAC
2a570 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
2a580 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
2a590 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
2a5a0 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
2a5b0 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
2a5c0 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
2a5d0 6c 6c 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ll));..  return 
2a5e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2a5f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2a600 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
2a610 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
2a620 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
2a630 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
2a640 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
2a650 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
2a660 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
2a670 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
2a680 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
2a690 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2a6a0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42 74  nce_shallower(Bt
2a6b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2a6c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a6e0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 42 2d   Root page of B-
2a6f0 54 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  Tree */.  MemPag
2a700 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20  e *pChild;      
2a710 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
2a720 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  ly child page of
2a730 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f   pPage */.  Pgno
2a740 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
2a750 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2a760 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69   number for pChi
2a770 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ld */.  int rc =
2a780 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2a790 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2a7a0 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  ode from subproc
2a7b0 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68  edures */.  BtSh
2a7c0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a7e0 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74  he main BTree st
2a7f0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
2a800 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20   mxCellPerPage; 
2a810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2a820 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
2a830 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f  ells per page */
2a840 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a860 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f  /* All cells fro
2a870 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  m pages being ba
2a880 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2a890 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2a8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2a8b0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2a8c0 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lls */..  assert
2a8d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2a8e0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
2a8f0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 0a  ur->apPage[0];..
2a900 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a910 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
2a920 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a930 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2a940 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2a950 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
2a960 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50  Bt;.  mxCellPerP
2a970 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42  age = MX_CELL(pB
2a980 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73  t);.  apCell = s
2a990 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78  qlite3Malloc( mx
2a9a0 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a  CellPerPage*(siz
2a9b0 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28  eof(u8*)+sizeof(
2a9c0 75 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61  u16)) );.  if( a
2a9d0 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pCell==0 ) retur
2a9e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2a9f0 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
2aa00 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50  )&apCell[mxCellP
2aa10 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70  erPage];.  if( p
2aa20 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2aa30 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69    /* The table i
2aa40 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
2aa50 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28  ty */.    TRACE(
2aa60 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79  ("BALANCE: empty
2aa70 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50   table %d\n", pP
2aa80 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
2aa90 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
2aaa0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
2aab0 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20  pty but has one 
2aac0 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72  child.  Transfer
2aad0 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f   the.    ** info
2aae0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61  rmation from tha
2aaf0 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f  t one child into
2ab00 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
2ab10 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  f it .    ** wil
2ab20 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64  l fit.  This red
2ab30 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f  uces the depth o
2ab40 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e  f the tree by on
2ab50 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2ab60 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   If the root pag
2ab70 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20  e is page 1, it 
2ab80 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61  has less space a
2ab90 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20  vailable than.  
2aba0 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28    ** its child (
2abb0 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62  due to the 100 b
2abc0 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20  yte header that 
2abd0 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65  occurs at the be
2abe0 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  ginning.    ** o
2abf0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2ac00 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74  le), so it might
2ac10 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
2ac20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  hold all of the 
2ac30 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
2ac40 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ion currently co
2ac50 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63  ntained in the c
2ac60 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69  hild.  If this i
2ac70 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61  s the .    ** ca
2ac80 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  se, then do not 
2ac90 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e  do the transfer.
2aca0 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65    Leave page 1 e
2acb0 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20  mpty except.    
2acc0 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ** for the right
2acd0 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20  -pointer to the 
2ace0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
2acf0 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f   child page beco
2ad00 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  mes.    ** the v
2ad10 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74  irtual root of t
2ad20 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a  he tree..    */.
2ad30 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43      VVA_ONLY( pC
2ad40 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65  ur->pagesShuffle
2ad50 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 70 67 6e  d = 1 );.    pgn
2ad60 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74  oChild = get4byt
2ad70 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2ad80 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2ad90 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +8]);.    assert
2ada0 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b  ( pgnoChild>0 );
2adb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2adc0 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67  oChild<=pagerPag
2add0 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42  ecount(pPage->pB
2ade0 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20  t->pPager) );.  
2adf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2ae00 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67 65  reeGetPage(pPage
2ae10 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  ->pBt, pgnoChild
2ae20 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20  , &pChild, 0);. 
2ae30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2ae40 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
2ae50 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50  ance;.    if( pP
2ae60 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  age->pgno==1 ){.
2ae70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ae80 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2ae90 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 69  pChild);.      i
2aea0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2aeb0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
2aec0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2aed0 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2aee0 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  w==0 );.      if
2aef0 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
2af00 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
2af10 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66  /* The child inf
2af20 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69  ormation will fi
2af30 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  t on the root pa
2af40 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20  ge, so do the.  
2af50 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f        ** copy */
2af60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
2af70 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65          zeroPage
2af80 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2af90 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
2afa0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
2afb0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
2afc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
2afd0 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  ell[i] = findCel
2afe0 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20  l(pChild,i);.   
2aff0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d         szCell[i]
2b000 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2b010 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d  Child, apCell[i]
2b020 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2b030 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67       assemblePag
2b040 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2b050 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20  >nCell, apCell, 
2b060 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20  szCell);.       
2b070 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67   /* Copy the rig
2b080 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht-pointer of th
2b090 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70  e child to the p
2b0a0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
2b0b0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2b0c0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2b0d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20  hdrOffset+8], . 
2b0e0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
2b0f0 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61  yte(&pChild->aDa
2b100 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66  ta[pChild->hdrOf
2b110 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2b120 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
2b130 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ld);.        TRA
2b140 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
2b150 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20  ild %d transfer 
2b160 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  to page 1\n", pC
2b170 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
2b180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b190 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
2b1a0 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  has more informa
2b1b0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66  tion that will f
2b1c0 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a  it on the root..
2b1d0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
2b1e0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62  ree is already b
2b1f0 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74  alanced.  Do not
2b200 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hing. */.       
2b210 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2b220 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20  : child %d will 
2b230 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20  not fit on page 
2b240 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
2b250 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
2b260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
2b270 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61  emcpy(pPage->aDa
2b280 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ta, pChild->aDat
2b290 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  a, pPage->pBt->u
2b2a0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
2b2b0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
2b2c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2b2d0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2b2e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2b2f0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2b300 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2b310 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2b320 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
2b330 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
2b340 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
2b350 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
2b360 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
2b370 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
2b380 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
2b390 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b3a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2b3b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2b3c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2b3d0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2b3e0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
2b3f0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
2b400 61 70 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20  aps(pPage);.    
2b410 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c  }.#endif.    rel
2b420 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
2b430 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f  ;.  }.end_shallo
2b440 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c  w_balance:.  sql
2b450 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c  ite3_free(apCell
2b460 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b470 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f  }.../*.** The ro
2b480 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  ot page is overf
2b490 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ull.**.** When t
2b4a0 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65  his happens, Cre
2b4b0 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20  ate a new child 
2b4c0 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68  page and copy th
2b4d0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
2b4e0 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74   the root into t
2b4f0 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20  he child.  Then 
2b500 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  make the root.**
2b510 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70   page an empty p
2b520 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68  age with rightCh
2b530 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ild pointing to 
2b540 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64  the new.** child
2b550 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c  .   Finally, cal
2b560 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e  l balance_intern
2b570 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  al() on the new 
2b580 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73  child.** to caus
2b590 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a  e it to split..*
2b5a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2b5b0 61 6e 63 65 5f 64 65 65 70 65 72 28 42 74 43 75  ance_deeper(BtCu
2b5c0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2b5d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2b5e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
2b5f0 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  ue from subproce
2b600 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  dures */.  MemPa
2b610 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 2f  ge *pPage;     /
2b620 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
2b630 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
2b640 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
2b650 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2b660 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
2b670 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
2b680 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50  oChild;     /* P
2b690 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2b6a0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
2b6b0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
2b6c0 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt;         /* 
2b6d0 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69  The BTree */.  i
2b6e0 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
2b6f0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62     /* Total usab
2b700 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67  le size of a pag
2b710 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  e */.  u8 *data;
2b720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2b730 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72  ntent of the par
2b740 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ent page */.  u8
2b750 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20   *cdata;        
2b760 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2b770 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a  the child page *
2b780 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2b790 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2b7a0 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72  t to page header
2b7b0 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20   in parent */.  
2b7c0 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
2b7d0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2b7e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73   content of firs
2b7f0 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74  t cell in parent
2b800 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2b810 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b  Cur->iPage==0 );
2b820 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b830 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65  >apPage[0]->nOve
2b840 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 56 56  rflow>0 );..  VV
2b850 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61  A_ONLY( pCur->pa
2b860 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20  gesShuffled = 1 
2b870 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2b880 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
2b890 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2b8a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b8b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2b8c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2b8d0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2b8e0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68  eePage(pBt, &pCh
2b8f0 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c  ild, &pgnoChild,
2b900 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29   pPage->pgno, 0)
2b910 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2b920 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74  urn rc;.  assert
2b930 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2b940 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
2b950 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2b960 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
2b970 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
2b980 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2b990 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
2b9a0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
2b9b0 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65   cbrk = get2byte
2b9c0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
2b9d0 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64    cdata = pChild
2b9e0 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70  ->aData;.  memcp
2b9f0 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68  y(cdata, &data[h
2ba00 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c  dr], pPage->cell
2ba10 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
2ba20 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65  nCell-hdr);.  me
2ba30 6d 63 70 79 28 26 63 64 61 74 61 5b 63 62 72 6b  mcpy(&cdata[cbrk
2ba40 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
2ba50 75 73 61 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29  usableSize-cbrk)
2ba60 3b 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  ;.  .  rc = sqli
2ba70 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2ba80 28 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20  (pChild);.  if( 
2ba90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2baa0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  .    int nCopy =
2bab0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2bac0 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  w*sizeof(pPage->
2bad0 61 4f 76 66 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d  aOvfl[0]);.    m
2bae0 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
2baf0 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66  vfl, pPage->aOvf
2bb00 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70  l, nCopy);.    p
2bb10 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2bb20 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2bb30 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 43 68  low;.    if( pCh
2bb40 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ild->nOverflow )
2bb50 7b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  {.      pChild->
2bb60 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 7d  nFree = 0;.    }
2bb70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68  .    assert( pCh
2bb80 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67  ild->nCell==pPag
2bb90 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2bba0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2bbb0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
2bbc0 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
2bbd0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2bbe0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2bbf0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2bc00 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 54  gnoChild);.    T
2bc10 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2bc20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
2bc30 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
2bc40 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
2bc50 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 49 53  no));.    if( IS
2bc60 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2bc70 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2bc80 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e  ut(pBt, pChild->
2bc90 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
2bca0 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  EE, pPage->pgno)
2bcb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2bcc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2bcd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2bce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bcf0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
2bd00 64 50 74 72 6d 61 70 73 28 70 43 68 69 6c 64 29  dPtrmaps(pChild)
2bd10 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2bd20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2bd30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bd40 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  ){.    pCur->iPa
2bd50 67 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ge++;.    pCur->
2bd60 61 70 50 61 67 65 5b 31 5d 20 3d 20 70 43 68 69  apPage[1] = pChi
2bd70 6c 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ld;.    pCur->ai
2bd80 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[0] = 0;.    
2bd90 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
2bda0 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  root(pCur);.  }e
2bdb0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
2bdc0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2bdd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2bde0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
2bdf0 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72  e that pCur curr
2be00 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
2be10 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f  has just been mo
2be20 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d  dified in.** som
2be30 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63  e way. This func
2be40 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74  tion figures out
2be50 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63   if this modific
2be60 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a  ation means the.
2be70 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  ** tree needs to
2be80 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e   be balanced, an
2be90 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68  d if so calls th
2bea0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
2beb0 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74  lancing .** rout
2bec0 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61  ine..** .** Para
2bed0 6d 65 74 65 72 20 69 73 49 6e 73 65 72 74 20 69  meter isInsert i
2bee0 73 20 74 72 75 65 20 69 66 20 61 20 6e 65 77 20  s true if a new 
2bef0 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e  cell was just in
2bf00 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 0a  serted into the.
2bf10 2a 2a 20 70 61 67 65 2c 20 6f 72 20 66 61 6c 73  ** page, or fals
2bf20 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
2bf30 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2bf40 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ce(BtCursor *pCu
2bf50 72 2c 20 69 6e 74 20 69 73 49 6e 73 65 72 74 29  r, int isInsert)
2bf60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2bf70 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2bf80 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2bf90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2bfa0 61 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  age];..  assert(
2bfb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2bfc0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2bfd0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2bfe0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2bff0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2c000 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2c010 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2c020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c030 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f  _OK && pPage->nO
2c040 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
2c050 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2c060 64 65 65 70 65 72 28 70 43 75 72 29 3b 0a 20 20  deeper(pCur);.  
2c070 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2c080 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
2c090 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
2c0a0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2c0b0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 43 75  ce_shallower(pCu
2c0c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
2c0d0 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
2c0e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
2c0f0 20 0a 20 20 20 20 20 20 20 20 28 21 69 73 49 6e   .        (!isIn
2c100 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
2c110 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
2c120 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
2c130 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2c140 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2c150 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
2c160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c170 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2c180 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
2c190 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
2c1a0 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
2c1b0 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
2c1c0 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
2c1d0 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
2c1e0 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
2c1f0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
2c200 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2c210 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
2c220 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
2c230 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
2c240 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
2c250 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
2c260 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
2c270 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
2c280 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
2c290 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
2c2a0 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
2c2b0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2c2c0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
2c2d0 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c  ED..**.** As wel
2c2e0 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69 74  l as cursors wit
2c2f0 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72  h wrFlag==0, cur
2c300 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67  sors with wrFlag
2c310 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73 49 6e  ==1 and .** isIn
2c320 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20  crblobHandle==1 
2c330 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65  are also conside
2c340 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f  red 'read' curso
2c350 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20  rs. Incremental 
2c360 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  .** blob cursors
2c370 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f   are used for bo
2c380 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
2c390 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  riting..**.** Wh
2c3a0 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  en pgnoRoot is t
2c3b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2c3c0 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  an intkey table,
2c3d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2c3e0 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e  s also.** respon
2c3f0 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69  sible for invali
2c400 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74  dating increment
2c410 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  al blob cursors 
2c420 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72  when the table r
2c430 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74  ow.** on which t
2c440 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69  hey are opened i
2c450 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64  s deleted or mod
2c460 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61  ified. Cursors a
2c470 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
2c480 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  * according to t
2c490 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c  he following rul
2c4a0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2c4b0 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61  hen BtreeClearTa
2c4c0 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ble() is called 
2c4d0 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65  to completely de
2c4e0 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lete the content
2c4f0 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42  s.**      of a B
2c500 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78  -Tree table, pEx
2c510 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
2c520 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74  zero and paramet
2c530 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20  er iRow is .**  
2c540 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a      set to non-z
2c550 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
2c560 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61  e all incrementa
2c570 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  l blob cursors o
2c580 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  pen.**      on t
2c590 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2c5a0 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20  at pgnoRoot are 
2c5b0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
2c5c0 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74 72  **   2) When Btr
2c5d0 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65  eeInsert(), Btre
2c5e0 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2c5f0 65 65 50 75 74 44 61 74 61 28 29 20 69 73 20 63  eePutData() is c
2c600 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20  alled to .**    
2c610 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65    modify a table
2c620 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20   row via an SQL 
2c630 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c  statement, pExcl
2c640 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ude is set to th
2c650 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65  e .**      write
2c660 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
2c670 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74  do the modificat
2c680 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65  ion and paramete
2c690 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a  r iRow is set.**
2c6a0 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74        to the int
2c6b0 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74  eger row id of t
2c6c0 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20  he B-Tree entry 
2c6d0 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20  being modified. 
2c6e0 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70  Unless.**      p
2c6f0 45 78 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c  Exclude is itsel
2c700 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
2c710 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68   blob cursor, th
2c720 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  en all increment
2c730 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20  al.**      blob 
2c740 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2c750 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20  row iRow of the 
2c760 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c  B-Tree are inval
2c770 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2c780 33 29 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c  3) If both pExcl
2c790 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65  ude and iRow are
2c7a0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f   set to zero, no
2c7b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2c7c0 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f  b .**      curso
2c7d0 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2c7e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2c7f0 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
2c800 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
2c810 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  e, .  Pgno pgnoR
2c820 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72 73 6f 72  oot, .  BtCursor
2c830 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20 69 36   *pExclude,.  i6
2c840 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74 43 75  4 iRow.){.  BtCu
2c850 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
2c860 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
2c870 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  e->pBt;.  sqlite
2c880 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  3 *db = pBtree->
2c890 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
2c8a0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2c8b0 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
2c8c0 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
2c8d0 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
2c8e0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d  ext){.    if( p=
2c8f0 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
2c900 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
2c910 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52  >pgnoRoot!=pgnoR
2c920 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oot ) continue;.
2c930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c940 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
2c950 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c   if( p->isIncrbl
2c960 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20  obHandle && ( . 
2c970 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c 75          (!pExclu
2c980 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20  de && iRow).    
2c990 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26    || (pExclude &
2c9a0 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49  & !pExclude->isI
2c9b0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
2c9c0 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
2c9d0 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  Row).    )){.   
2c9e0 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
2c9f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2ca00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2ca10 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
2ca20 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
2ca30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2ca40 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69  p->wrFlag==0 .#i
2ca50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ca60 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
2ca70 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  || p->isIncrblob
2ca80 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20  Handle.#endif.  
2ca90 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
2caa0 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d  e3 *dbOther = p-
2cab0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
2cac0 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d     if( dbOther==
2cad0 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64  0 ||.         (d
2cae0 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64  bOther!=db && (d
2caf0 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20  bOther->flags & 
2cb00 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2cb10 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20  mitted)==0) ){. 
2cb20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2cb30 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
2cb40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2cb50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cb60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
2cb70 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
2cb80 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
2cb90 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
2cba0 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
2cbb0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
2cbc0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
2cbd0 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
2cbe0 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
2cbf0 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
2cc00 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
2cc10 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
2cc20 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
2cc30 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2cc40 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2cc50 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2cc60 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
2cc70 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
2cc80 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
2cc90 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
2cca0 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
2ccb0 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
2ccc0 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
2ccd0 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
2cce0 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
2ccf0 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  th ignored..*/.i
2cd00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
2cd10 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
2cd20 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2cd30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
2cd40 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
2cd50 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
2cd60 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
2cd70 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2cd80 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2cd90 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
2cda0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
2cdb0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
2cdc0 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
2cdd0 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
2cde0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
2cdf0 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ce10 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
2ce20 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2ce30 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
2ce40 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20  t appendBias    
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce60 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2ce70 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
2ce80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2ce90 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e  .  int loc;.  in
2cea0 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t szNew;.  int i
2ceb0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2cec0 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
2ced0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
2cee0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2cef0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2cf00 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
2cf10 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
2cf20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
2cf30 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
2cf40 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2cf50 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42  Cur) );.  if( pB
2cf60 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2cf70 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2cf80 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2cf90 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2cfa0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   before doing an
2cfb0 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72   insert */.    r
2cfc0 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2cfd0 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2cfe0 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2cff0 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  OR;.    return r
2d000 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2d010 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2d020 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e  );.  if( !pCur->
2d030 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2d040 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2d050 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f  ;   /* Cursor no
2d060 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  t open for writi
2d070 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2d080 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2d090 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
2d0a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2d0b0 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20  r, nKey) ){.    
2d0c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2d0d0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2d0e0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2d0f0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2d100 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
2d110 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2d120 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2d130 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
2d140 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61  ip;.  }..  /* Sa
2d150 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2d160 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2d170 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
2d180 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  is table */.  sq
2d190 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
2d1a0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 69  ursor(pCur);.  i
2d1b0 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f  f( .    SQLITE_O
2d1c0 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
2d1d0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
2d1e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2d1f0 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54  r)) ||.    SQLIT
2d200 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
2d210 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70  te3BtreeMoveto(p
2d220 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  Cur, pKey, nKey,
2d230 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f   appendBias, &lo
2d240 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  c)).  ){.    ret
2d250 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
2d260 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2d270 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d290 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
2d2a0 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
2d2b0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
2d2c0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
2d2d0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  );.  TRACE(("INS
2d2e0 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
2d2f0 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
2d300 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
2d310 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d320 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
2d330 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
2d340 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
2d350 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
2d360 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
2d370 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
2d380 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2d390 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
2d3a0 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65  ce(pBt);.  newCe
2d3b0 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
2d3c0 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65  ace;.  if( newCe
2d3d0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
2d3e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
2d3f0 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  c = fillInCell(p
2d400 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70  Page, newCell, p
2d410 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61  Key, nKey, pData
2d420 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20  , nData, nZero, 
2d430 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  &szNew);.  if( r
2d440 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2d450 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ert;.  assert( s
2d460 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  zNew==cellSizePt
2d470 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  r(pPage, newCell
2d480 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2d490 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49  zNew<=MX_CELL_SI
2d4a0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78  ZE(pBt) );.  idx
2d4b0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2d4c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2d4d0 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52  f( loc==0 && CUR
2d4e0 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
2d4f0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 75  >eState ){.    u
2d500 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73  16 szOld;.    as
2d510 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d  sert( idx<pPage-
2d520 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
2d530 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d540 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2d550 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2d560 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
2d570 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
2d580 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
2d590 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
2d5a0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
2d5b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d5c0 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
2d5d0 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
2d5e0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
2d5f0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2d600 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2d610 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2d620 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
2d630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2d640 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2d650 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65  .    rc = dropCe
2d660 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73  ll(pPage, idx, s
2d670 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72  zOld);.    if( r
2d680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  c!=SQLITE_OK ) {
2d690 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2d6a0 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
2d6b0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
2d6c0 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
2d6d0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
2d6e0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2d6f0 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72      idx = ++pCur
2d700 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d710 61 67 65 5d 3b 0a 20 20 20 20 70 43 75 72 2d 3e  age];.    pCur->
2d720 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2d730 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
2d740 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
2d750 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2d760 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d  age->leaf );.  }
2d770 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65  .  rc = insertCe
2d780 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e  ll(pPage, idx, n
2d790 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30  ewCell, szNew, 0
2d7a0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
2d7b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2d7c0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72   end_insert;.  r
2d7d0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
2d7e0 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 1);.  if( rc==
2d7f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d800 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2d810 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
2d820 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
2d830 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2d840 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
2d850 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
2d860 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
2d870 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2d880 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 61   pointing at a a
2d890 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69 6f  rbitrary locatio
2d8a0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2d8b0 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43  3BtreeDelete(BtC
2d8c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2d8d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2d8e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2d8f0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e  ur->iPage];.  in
2d900 74 20 69 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65  t idx;.  unsigne
2d910 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
2d920 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
2d930 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20  pgnoChild = 0;. 
2d940 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
2d950 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
2d960 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2d970 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
2d980 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2d990 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d9a0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2d9b0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
2d9c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2d9d0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2d9e0 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2d9f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66   transaction bef
2da00 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65  ore doing a dele
2da10 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  te */.    rc = p
2da20 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2da30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2da40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2da50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2da60 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2da70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2da80 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2da90 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
2daa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
2dab0 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69  r->skip;.  }.  i
2dac0 66 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  f( pCur->aiIdx[p
2dad0 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
2dae0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2daf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2db00 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75  RROR;  /* The cu
2db10 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2db20 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67  ting to anything
2db30 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   */.  }.  if( !p
2db40 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
2db50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2db60 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20  _PERM;   /* Did 
2db70 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73 20 63 75  not open this cu
2db80 72 73 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rsor for writing
2db90 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68   */.  }.  if( ch
2dba0 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75  eckReadLocks(pCu
2dbb0 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
2dbc0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c  >pgnoRoot, pCur,
2dbd0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2dbe0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2dbf0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f  SQLITE_LOCKED; /
2dc00 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
2dc10 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
2dc20 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
2dc30 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  }..  /* Restore 
2dc40 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2dc50 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e  or position (a n
2dc60 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75 72 73  o-op if the curs
2dc70 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20  or is not in .  
2dc80 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  ** CURSOR_REQUIR
2dc90 45 53 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64  ESEEK state) and
2dca0 20 73 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   save the positi
2dcb0 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
2dcc0 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f   cursors .  ** o
2dcd0 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2dce0 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c  table. Then call
2dcf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2dd00 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65  te() on the page
2dd10 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65  .  ** that the e
2dd20 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c  ntry will be del
2dd30 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a  eted from..  */.
2dd40 20 20 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d    if( .    (rc =
2dd50 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2dd60 73 69 74 69 6f 6e 28 70 43 75 72 29 29 21 3d 30  sition(pCur))!=0
2dd70 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61   ||.    (rc = sa
2dd80 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2dd90 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2dda0 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  , pCur))!=0 ||. 
2ddb0 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33     (rc = sqlite3
2ddc0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2ddd0 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a 20  ->pDbPage))!=0. 
2dde0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2ddf0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  c;.  }..  /* Loc
2de00 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74  ate the cell wit
2de10 68 69 6e 20 69 74 73 20 70 61 67 65 20 61 6e 64  hin its page and
2de20 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69   leave pCell poi
2de30 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a  nting to the.  *
2de40 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61  * data. The clea
2de50 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65  rCell() call fre
2de60 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  es any overflow 
2de70 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2de80 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63   with the.  ** c
2de90 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74  ell. The cell it
2dea0 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e  self is still in
2deb0 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 64 78  tact..  */.  idx
2dec0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2ded0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 70  Cur->iPage];.  p
2dee0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2def0 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 69  pPage, idx);.  i
2df00 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2df10 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  ){.    pgnoChild
2df20 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
2df30 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  l);.  }.  rc = c
2df40 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2df50 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63  pCell);.  if( rc
2df60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2df70 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  c;.  }..  if( !p
2df80 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2df90 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
2dfa0 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f  entry we are abo
2dfb0 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20  ut to delete is 
2dfc0 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66  not a leaf so if
2dfd0 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   we do not.    *
2dfe0 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  * do something w
2dff0 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68  e will leave a h
2e000 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e  ole on an intern
2e010 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20  al page..    ** 
2e020 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20  We have to fill 
2e030 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69  the hole by movi
2e040 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f  ng in a cell fro
2e050 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20  m a leaf.  The. 
2e060 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20     ** next Cell 
2e070 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f  after the one to
2e080 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67   be deleted is g
2e090 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
2e0a0 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f  st and.    ** to
2e0b0 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65   be a leaf so we
2e0c0 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20   can use it..   
2e0d0 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72   */.    BtCursor
2e0e0 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 4d 65   leafCur;.    Me
2e0f0 6d 50 61 67 65 20 2a 70 4c 65 61 66 50 61 67 65  mPage *pLeafPage
2e100 3b 0a 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ;..    unsigned 
2e110 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20  char *pNext;.   
2e120 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
2e130 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2e140 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20  *tempCell = 0;. 
2e150 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2e160 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  e->intKey );.   
2e170 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2e180 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2e190 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20   &leafCur);.    
2e1a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2e1b0 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2e1c0 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2e1d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e1e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e1f0 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b  ( leafCur.aiIdx[
2e200 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d  leafCur.iPage]==
2e210 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66  0 );.      pLeaf
2e220 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61  Page = leafCur.a
2e230 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50  pPage[leafCur.iP
2e240 61 67 65 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  age];.      rc =
2e250 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2e260 74 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44  te(pLeafPage->pD
2e270 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
2e280 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
2e2a0 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
2e2b0 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 31  id = 0;.      u1
2e2c0 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20  6 szNext;.      
2e2d0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2e2e0 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2e2f0 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64  internal from %d
2e300 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65   replace from le
2e310 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  af %d\n",.      
2e320 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2e330 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  t, pPage->pgno, 
2e340 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 29  pLeafPage->pgno)
2e350 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c  );.      dropCel
2e360 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63 65  l(pPage, idx, ce
2e370 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2e380 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20   pCell));.      
2e390 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c  pNext = findCell
2e3a0 28 70 4c 65 61 66 50 61 67 65 2c 20 30 29 3b 0a  (pLeafPage, 0);.
2e3b0 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63        szNext = c
2e3c0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66  ellSizePtr(pLeaf
2e3d0 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20  Page, pNext);.  
2e3e0 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43      assert( MX_C
2e3f0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73  ELL_SIZE(pBt)>=s
2e400 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20  zNext+4 );.     
2e410 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
2e420 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74  ce(pBt);.      t
2e430 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  empCell = pBt->p
2e440 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  TmpSpace;.      
2e450 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20  if( tempCell==0 
2e460 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2e470 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2e480 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e4a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
2e4b0 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20  sertCell(pPage, 
2e4c0 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a  idx, pNext-4, sz
2e4d0 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c  Next+4, tempCell
2e4e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  , 0);.      }...
2e4f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 69 66        /* The "if
2e500 22 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  " statement in t
2e510 68 65 20 6e 65 78 74 20 63 6f 64 65 20 62 6c 6f  he next code blo
2e520 63 6b 20 69 73 20 63 72 69 74 69 63 61 6c 2e 20  ck is critical. 
2e530 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 6c   The.      ** sl
2e540 69 67 68 74 65 73 74 20 65 72 72 6f 72 20 69 6e  ightest error in
2e550 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20   that statement 
2e560 77 6f 75 6c 64 20 61 6c 6c 6f 77 20 53 51 4c 69  would allow SQLi
2e570 74 65 20 74 6f 20 6f 70 65 72 61 74 65 0a 20 20  te to operate.  
2e580 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79      ** correctly
2e590 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 69 6d   most of the tim
2e5a0 65 20 62 75 74 20 70 72 6f 64 75 63 65 20 76 65  e but produce ve
2e5b0 72 79 20 72 61 72 65 20 66 61 69 6c 75 72 65 73  ry rare failures
2e5c0 2e 20 20 54 6f 0a 20 20 20 20 20 20 2a 2a 20 67  .  To.      ** g
2e5d0 75 61 72 64 20 61 67 61 69 6e 73 74 20 74 68 69  uard against thi
2e5e0 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
2e5f0 20 6d 61 63 72 6f 73 20 68 65 6c 70 20 74 6f 20   macros help to 
2e600 76 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20  verify that.    
2e610 20 20 2a 2a 20 74 68 65 20 22 69 66 22 20 73 74    ** the "if" st
2e620 61 74 65 6d 65 6e 74 20 69 73 20 77 65 6c 6c 20  atement is well 
2e630 74 65 73 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  tested..      */
2e640 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2e650 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2e660 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  w==0 && pPage->n
2e670 46 72 65 65 3c 70 42 74 2d 3e 75 73 61 62 6c 65  Free<pBt->usable
2e680 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20  Size*2/3 .      
2e690 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
2e6a0 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
2e6b0 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75  +szNext > pBt->u
2e6c0 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
2e6d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2e6e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2e6f0 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  w==0 && pPage->n
2e700 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Free==pBt->usabl
2e710 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20  eSize*2/3 .     
2e720 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
2e730 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
2e740 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e  2+szNext > pBt->
2e750 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29  usableSize*2/3 )
2e760 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2e770 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2e780 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
2e790 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62  nFree==pBt->usab
2e7a0 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 0a 20 20  leSize*2/3+1 .  
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2e7c0 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72  & pLeafPage->nFr
2e7d0 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42  ee+2+szNext > pB
2e7e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2e7f0 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  3 );.      testc
2e800 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ase( pPage->nOve
2e810 72 66 6c 6f 77 3e 30 20 26 26 20 70 50 61 67 65  rflow>0 && pPage
2e820 2d 3e 6e 46 72 65 65 3c 3d 70 42 74 2d 3e 75 73  ->nFree<=pBt->us
2e830 61 62 6c 65 53 69 7a 65 2a 32 2f 33 0a 20 20 20  ableSize*2/3.   
2e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2e850 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
2e860 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
2e870 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2e880 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2e890 73 65 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65  se( (pPage->nOve
2e8a0 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67  rflow>0 || (pPag
2e8b0 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e  e->nFree > pBt->
2e8c0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29  usableSize*2/3))
2e8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e8e0 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e    && pLeafPage->
2e8f0 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3d  nFree+2+szNext =
2e900 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2e910 65 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20 20 20 20  e*2/3 );...     
2e920 20 69 66 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76   if( (pPage->nOv
2e930 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61  erflow>0 || (pPa
2e940 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d  ge->nFree > pBt-
2e950 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
2e960 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28  ) &&.          (
2e970 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
2e980 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d  +2+szNext > pBt-
2e990 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
2e9a0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2e9b0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2e9c0 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65   is taken if the
2e9d0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69   internal node i
2e9e0 73 20 6e 6f 77 20 65 69 74 68 65 72 20 6f 76 65  s now either ove
2e9f0 72 66 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 20  rflowing.       
2ea00 20 2a 2a 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c   ** or underfull
2ea10 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 6e 6f   and the leaf no
2ea20 64 65 20 77 69 6c 6c 20 62 65 20 75 6e 64 65 72  de will be under
2ea30 66 75 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6a  full after the j
2ea40 75 73 74 20 63 65 6c 6c 20 0a 20 20 20 20 20 20  ust cell .      
2ea50 20 20 2a 2a 20 63 6f 70 69 65 64 20 74 6f 20 74    ** copied to t
2ea60 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
2ea70 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
2ea80 20 69 74 2e 20 54 68 69 73 20 69 73 20 61 20 73   it. This is a s
2ea90 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  pecial.        *
2eaa0 2a 20 63 61 73 65 20 62 65 63 61 75 73 65 20 74  * case because t
2eab0 68 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  he call to balan
2eac0 63 65 28 29 20 74 6f 20 63 6f 72 72 65 63 74 20  ce() to correct 
2ead0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2eae0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  e.        ** may
2eaf0 20 63 68 61 6e 67 65 20 74 68 65 20 74 72 65 65   change the tree
2eb00 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 69   structure and i
2eb10 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f  nvalidate the co
2eb20 6e 74 65 6e 74 73 20 6f 66 0a 20 20 20 20 20 20  ntents of.      
2eb30 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 43 75 72    ** the leafCur
2eb40 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65  .apPage[] and le
2eb50 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72  afCur.aiIdx[] ar
2eb60 72 61 79 73 2c 20 77 68 69 63 68 20 77 69 6c 6c  rays, which will
2eb70 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 75   be.        ** u
2eb80 73 65 64 20 62 79 20 74 68 65 20 62 61 6c 61 6e  sed by the balan
2eb90 63 65 28 29 20 72 65 71 75 69 72 65 64 20 74 6f  ce() required to
2eba0 20 63 6f 72 72 65 63 74 20 74 68 65 20 75 6e 64   correct the und
2ebb0 65 72 66 75 6c 6c 20 6c 65 61 66 0a 20 20 20 20  erfull leaf.    
2ebc0 20 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20 20      ** node..   
2ebd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2ebe0 2a 2a 20 54 68 65 20 66 6f 72 6d 75 6c 61 20 75  ** The formula u
2ebf0 73 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65  sed in the expre
2ec00 73 73 69 6f 6e 20 61 62 6f 76 65 20 61 72 65 20  ssion above are 
2ec10 62 61 73 65 64 20 6f 6e 20 66 61 63 65 74 73 20  based on facets 
2ec20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
2ec30 65 20 53 51 4c 69 74 65 20 66 69 6c 65 2d 66 6f  e SQLite file-fo
2ec40 72 6d 61 74 20 74 68 61 74 20 64 6f 20 6e 6f 74  rmat that do not
2ec50 20 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d   change over tim
2ec60 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
2ec70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ec80 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42  pPage->nFree==pB
2ec90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2eca0 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  3+1 );.        t
2ecb0 65 73 74 63 61 73 65 28 20 70 4c 65 61 66 50 61  estcase( pLeafPa
2ecc0 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
2ecd0 78 74 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  xt==pBt->usableS
2ece0 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20  ize*2/3+1 );.   
2ecf0 20 20 20 20 20 6c 65 61 66 43 75 72 73 6f 72 49       leafCursorI
2ed00 6e 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  nvalid = 1;.    
2ed10 20 20 7d 20 20 20 20 20 20 20 20 0a 0a 20 20 20    }        ..   
2ed20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ed30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ed40 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
2ed50 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c  rflowCell(pPage,
2ed60 20 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64   idx), pgnoChild
2ed70 29 3b 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f  );.        VVA_O
2ed80 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73  NLY( pCur->pages
2ed90 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a  Shuffled = 0 );.
2eda0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
2edb0 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20  ance(pCur, 0);. 
2edc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2edd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ede0 26 26 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76  && leafCursorInv
2edf0 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  alid ){.        
2ee00 2f 2a 20 54 68 65 20 6c 65 61 66 2d 6e 6f 64 65  /* The leaf-node
2ee10 20 69 73 20 6e 6f 77 20 75 6e 64 65 72 66 75 6c   is now underful
2ee20 6c 20 61 6e 64 20 73 6f 20 74 68 65 20 74 72 65  l and so the tre
2ee30 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
2ee40 20 20 20 20 20 20 20 2a 2a 20 72 65 62 61 6c 61         ** rebala
2ee50 6e 63 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74  nced. However, t
2ee60 68 65 20 62 61 6c 61 6e 63 65 28 29 20 6f 70 65  he balance() ope
2ee70 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 69 6e  ration on the in
2ee80 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ternal.        *
2ee90 2a 20 6e 6f 64 65 20 61 62 6f 76 65 20 6d 61 79  * node above may
2eea0 20 68 61 76 65 20 6d 6f 64 69 66 69 65 64 20 74   have modified t
2eeb0 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  he structure of 
2eec0 74 68 65 20 42 2d 54 72 65 65 20 61 6e 64 0a 20  the B-Tree and. 
2eed0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 65         ** so the
2eee0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
2eef0 73 20 6f 66 20 6c 65 61 66 43 75 72 2e 61 70 50  s of leafCur.apP
2ef00 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75  age[] and leafCu
2ef10 72 2e 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20  r.aiIdx[].      
2ef20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
2ef30 74 72 75 73 74 65 64 2e 0a 20 20 20 20 20 20 20  trusted..       
2ef40 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
2ef50 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
2ef60 65 20 74 6f 20 63 6f 70 79 20 74 68 65 20 61 6e  e to copy the an
2ef70 63 65 73 74 72 79 20 66 72 6f 6d 20 70 43 75 72  cestry from pCur
2ef80 2c 20 61 73 20 74 68 65 20 73 61 6d 65 0a 20 20  , as the same.  
2ef90 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
2efa0 28 29 20 63 61 6c 6c 20 68 61 73 20 69 6e 76 61  () call has inva
2efb0 6c 69 64 61 74 65 64 20 74 68 65 20 70 43 75 72  lidated the pCur
2efc0 2d 3e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  ->apPage[] and a
2efd0 69 49 64 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a  iIdx[].        *
2efe0 2a 20 61 72 72 61 79 73 2e 20 0a 20 20 20 20 20  * arrays. .     
2eff0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2f000 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 61 76   The call to sav
2f010 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2f020 29 20 62 65 6c 6f 77 20 69 6e 74 65 72 6e 61 6c  ) below internal
2f030 6c 79 20 73 61 76 65 73 20 74 68 65 20 0a 20 20  ly saves the .  
2f040 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 74 68 61        ** key tha
2f050 74 20 6c 65 61 66 43 75 72 20 69 73 20 63 75 72  t leafCur is cur
2f060 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
2f070 74 6f 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20 74  to. Currently, t
2f080 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
2f090 61 72 65 20 74 77 6f 20 63 6f 70 69 65 73 20 6f  are two copies o
2f0a0 66 20 74 68 61 74 20 6b 65 79 20 69 6e 20 74 68  f that key in th
2f0b0 65 20 74 72 65 65 20 2d 20 6f 6e 65 20 68 65 72  e tree - one her
2f0c0 65 20 6f 6e 20 74 68 65 20 6c 65 61 66 0a 20 20  e on the leaf.  
2f0d0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 61 6e        ** page an
2f0e0 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d 65 20 69 6e  d one on some in
2f0f0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 74  ternal node in t
2f100 68 65 20 74 72 65 65 2e 20 54 68 65 20 63 6f 70  he tree. The cop
2f110 79 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  y on.        ** 
2f120 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 69 73  the leaf node is
2f130 20 61 6c 77 61 79 73 20 74 68 65 20 6e 65 78 74   always the next
2f140 20 6b 65 79 20 69 6e 20 74 72 65 65 2d 6f 72 64   key in tree-ord
2f150 65 72 20 61 66 74 65 72 20 74 68 65 20 0a 20 20  er after the .  
2f160 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 6e        ** copy on
2f170 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
2f180 64 65 2e 20 53 6f 2c 20 74 68 65 20 63 61 6c 6c  de. So, the call
2f190 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2f1a0 4e 65 78 74 28 29 0a 20 20 20 20 20 20 20 20 2a  Next().        *
2f1b0 2a 20 63 61 6c 6c 73 20 72 65 73 74 6f 72 65 43  * calls restoreC
2f1c0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
2f1d0 74 6f 20 70 6f 69 6e 74 20 74 68 65 20 63 75 72  to point the cur
2f1e0 73 6f 72 20 74 6f 20 74 68 65 20 63 6f 70 79 0a  sor to the copy.
2f1f0 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2f200 64 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  d on the interna
2f210 6c 20 6e 6f 64 65 2c 20 74 68 65 6e 20 61 64 76  l node, then adv
2f220 61 6e 63 65 73 20 74 6f 20 74 68 65 20 6e 65 78  ances to the nex
2f230 74 20 65 6e 74 72 79 2c 0a 20 20 20 20 20 20 20  t entry,.       
2f240 20 2a 2a 20 77 68 69 63 68 20 68 61 70 70 65 6e   ** which happen
2f250 73 20 74 6f 20 62 65 20 74 68 65 20 63 6f 70 79  s to be the copy
2f260 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 6e 20 74   of the key on t
2f270 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
2f280 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 65 74  ..        ** Net
2f290 20 65 66 66 65 63 74 3a 20 6c 65 61 66 43 75 72   effect: leafCur
2f2a0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 62 61 63   is pointing bac
2f2b0 6b 20 74 6f 20 74 68 65 20 64 75 70 6c 69 63 61  k to the duplica
2f2c0 74 65 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20  te cell.        
2f2d0 2a 2a 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ** that needs to
2f2e0 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 61 6e 64   be removed, and
2f2f0 20 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70 50   the leafCur.apP
2f300 61 67 65 5b 5d 20 61 6e 64 0a 20 20 20 20 20 20  age[] and.      
2f310 20 20 2a 2a 20 6c 65 61 66 43 75 72 2e 61 69 49    ** leafCur.aiI
2f320 64 78 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20  dx[] arrays are 
2f330 63 6f 72 72 65 63 74 2e 0a 20 20 20 20 20 20 20  correct..       
2f340 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 56 41 5f   */.        VVA_
2f350 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c 65 61 66 50  ONLY( Pgno leafP
2f360 67 6e 6f 20 3d 20 70 4c 65 61 66 50 61 67 65 2d  gno = pLeafPage-
2f370 3e 70 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20  >pgno );.       
2f380 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
2f390 50 6f 73 69 74 69 6f 6e 28 26 6c 65 61 66 43 75  Position(&leafCu
2f3a0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
2f3b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f3c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2f3d0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2f3e0 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55  (&leafCur, &notU
2f3f0 73 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sed);.        }.
2f400 20 20 20 20 20 20 20 20 70 4c 65 61 66 50 61 67          pLeafPag
2f410 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70 50 61  e = leafCur.apPa
2f420 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65  ge[leafCur.iPage
2f430 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
2f440 74 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67  t( pLeafPage->pg
2f450 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20 29 3b 0a  no==leafPgno );.
2f460 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f470 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65  leafCur.aiIdx[le
2f480 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20  afCur.iPage]==0 
2f490 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2f4a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f4b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 64  _OK ){.        d
2f4c0 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50 61 67  ropCell(pLeafPag
2f4d0 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b 0a 20  e, 0, szNext);. 
2f4e0 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28         VVA_ONLY(
2f4f0 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53 68   leafCur.pagesSh
2f500 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20  uffled = 0 );.  
2f510 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2f520 63 65 28 26 6c 65 61 66 43 75 72 2c 20 30 29 3b  ce(&leafCur, 0);
2f530 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f540 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c   leafCursorInval
2f550 69 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70  id || !leafCur.p
2f560 61 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20 20  agesShuffled.   
2f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f590 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73 53  || !pCur->pagesS
2f5a0 68 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20 20  huffled );.     
2f5b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2f5c0 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65  ite3BtreeRelease
2f5d0 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66  TempCursor(&leaf
2f5e0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2f5f0 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
2f600 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
2f610 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  te from leaf %d\
2f620 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d  n",.       pCur-
2f630 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2f640 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72  ->pgno));.    dr
2f650 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
2f660 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2f670 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2f680 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2f690 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pCur, 0);.  }.  
2f6a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f6b0 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2f6c0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
2f6d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f6e0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2f6f0 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2f700 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2f710 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2f720 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2f730 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2f740 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2f750 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2f760 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2f770 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2f780 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2f790 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2f7a0 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2f7b0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2f7c0 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2f7d0 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2f7e0 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2f7f0 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2f800 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2f810 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2f820 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2f830 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2f840 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2f850 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2f860 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2f870 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61  L indices.*/.sta
2f880 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65  tic int btreeCre
2f890 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2f8a0 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2f8b0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2f8c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2f8d0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2f8e0 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2f8f0 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2f900 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
2f910 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2f920 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
2f930 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2f940 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2f950 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2f960 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2f970 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20  tion first */.  
2f980 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2f990 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2f9a0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2f9b0 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2f9c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2f9d0 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2f9e0 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ly );..#ifdef SQ
2f9f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2fa00 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  CUUM.  rc = allo
2fa10 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2fa20 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2fa30 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69  Root, 1, 0);.  i
2fa40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2fa50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73  urn rc;.  }.#els
2fa60 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  e.  if( pBt->aut
2fa70 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
2fa80 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20  gno pgnoMove;   
2fa90 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67     /* Move a pag
2faa0 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72  e here to make r
2fab0 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  oom for the root
2fac0 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  -page */.    Mem
2fad0 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b  Page *pPageMove;
2fae0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2faf0 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20  move to. */..   
2fb00 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e   /* Creating a n
2fb10 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f  ew table may pro
2fb20 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f  bably require mo
2fb30 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  ving an existing
2fb40 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2fb50 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2fb60 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  r the new tables
2fb70 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63   root page. In c
2fb80 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75  ase this page tu
2fb90 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  rns.    ** out t
2fba0 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  o be an overflow
2fbb0 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c   page, delete al
2fbc0 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  l overflow page-
2fbd0 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a  map caches.    *
2fbe0 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63  * held by open c
2fbf0 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  ursors..    */. 
2fc00 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
2fc10 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
2fc20 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  t);..    /* Read
2fc30 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
2fc40 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64  ta[3] from the d
2fc50 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72  atabase to deter
2fc60 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20  mine where the. 
2fc70 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
2fc80 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
2fc90 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61   should go. meta
2fca0 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65  [3] is the large
2fcb0 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2fcc0 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66   ** created so f
2fcd0 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72  ar, so the new r
2fce0 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74  oot-page is (met
2fcf0 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a  a[3]+1)..    */.
2fd00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fd10 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
2fd20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  4, &pgnoRoot);. 
2fd30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2fd40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2fd50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2fd60 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a     pgnoRoot++;..
2fd70 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
2fd80 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74  oot-page may not
2fd90 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e   be allocated on
2fda0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2fdb0 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  age, or the.    
2fdc0 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
2fdd0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2fde0 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74   while( pgnoRoot
2fdf0 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
2fe00 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c  pBt, pgnoRoot) |
2fe10 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f  |.        pgnoRo
2fe20 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ot==PENDING_BYTE
2fe30 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2fe40 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2fe50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2fe60 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b  ( pgnoRoot>=3 );
2fe70 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
2fe80 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61  e a page. The pa
2fe90 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  ge that currentl
2fea0 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e  y resides at pgn
2feb0 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a  oRoot will.    *
2fec0 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  * be moved to th
2fed0 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2fee0 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c   (unless the all
2fef0 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70  ocated page happ
2ff00 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65  ens.    ** to re
2ff10 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  side at pgnoRoot
2ff20 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2ff30 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2ff40 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65  Page(pBt, &pPage
2ff50 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c  Move, &pgnoMove,
2ff60 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20   pgnoRoot, 1);. 
2ff70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ff80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2ff90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2ffa0 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65      if( pgnoMove
2ffb0 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  !=pgnoRoot ){.  
2ffc0 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20      /* pgnoRoot 
2ffd0 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
2ffe0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
2fff0 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
30000 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
30010 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d  new table (assum
30020 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64  ing an error did
30030 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74   not occur). But
30040 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a   we were.      *
30050 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f  * allocated pgno
30060 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65  Move. If require
30070 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61  d (i.e. if it wa
30080 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a  s not allocated.
30090 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65        ** by exte
300a0 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c  nding the file),
300b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
300c0 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67  e at position pg
300d0 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20  noMove.      ** 
300e0 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e  is already journ
300f0 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  aled..      */. 
30100 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
30110 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
30120 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
30130 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
30140 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76  );..      /* Mov
30150 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  e the page curre
30160 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ntly at pgnoRoot
30170 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f   to pgnoMove. */
30180 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
30190 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
301a0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
301b0 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
301c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
301d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
301e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
301f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
30200 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52  apGet(pBt, pgnoR
30210 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50  oot, &eType, &iP
30220 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  trPage);.      i
30230 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30240 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
30250 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
30260 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
30270 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
30280 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
30290 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
302a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
302b0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
302c0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
302d0 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AGE );.      ass
302e0 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
302f0 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20  AP_FREEPAGE );. 
30300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30310 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
30320 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
30330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30350 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
30360 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
30370 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
30380 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
30390 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f  tePage(pBt, pRoo
303a0 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  t, eType, iPtrPa
303b0 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29  ge, pgnoMove, 0)
303c0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
303d0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20  age(pRoot);..   
303e0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65     /* Obtain the
303f0 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f   page at pgnoRoo
30400 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  t */.      if( r
30410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30420 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30430 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
30440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
30450 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
30460 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
30470 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
30480 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
304a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
304b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
304c0 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
304d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
304e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
304f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
30500 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
30510 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30520 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
30530 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f  else{.      pRoo
30540 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20  t = pPageMove;. 
30550 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70     } ..    /* Up
30560 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
30570 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61  -map and meta-da
30580 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ta with the new 
30590 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
305a0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74  . */.    rc = pt
305b0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
305c0 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f  oRoot, PTRMAP_RO
305d0 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  OTPAGE, 0);.    
305e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
305f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
30600 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
30610 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
30620 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
30630 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
30640 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20   pgnoRoot);.    
30650 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
30660 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
30670 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
30680 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   rc;.    }..  }e
30690 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  lse{.    rc = al
306a0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
306b0 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
306c0 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
306d0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
306e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
306f0 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  f.  assert( sqli
30700 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30710 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
30720 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ge) );.  zeroPag
30730 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
30740 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
30750 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
30760 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
30770 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69  .  *piTable = (i
30780 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72  nt)pgnoRoot;.  r
30790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
307a0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
307b0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
307c0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
307d0 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
307e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
307f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
30800 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
30810 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
30820 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  = btreeCreateTab
30830 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66  le(p, piTable, f
30840 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
30850 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
30860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30870 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67  *.** Erase the g
30880 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  iven database pa
30890 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63  ge and all its c
308a0 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e  hildren.  Return
308b0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20  .** the page to 
308c0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f  the freelist..*/
308d0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
308e0 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20  rDatabasePage(. 
308f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
30900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30910 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74   BTree that cont
30920 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a  ains the table *
30930 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
30940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
30950 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61  e number to clea
30960 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
30970 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
30980 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55  Parent page.  NU
30990 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  LL for the root 
309a0 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67  */.  int freePag
309b0 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65  eFlag,     /* De
309c0 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66  allocate page if
309d0 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   true */.  int *
309e0 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65  pnChange.){.  Me
309f0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
30a00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
30a10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
30a20 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
30a30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
30a40 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
30a50 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
30a60 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
30a70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
30a80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
30a90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30aa0 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
30ab0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
30ac0 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
30ad0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
30ae0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
30af0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
30b00 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
30b10 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
30b20 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
30b30 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
30b40 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
30b50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
30b60 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
30b70 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
30b80 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 31 2c 20  ell), pPage, 1, 
30b90 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  pnChange);.     
30ba0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
30bb0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
30bc0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
30bd0 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
30be0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
30bf0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30c00 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
30c10 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
30c20 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
30c30 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
30c40 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
30c50 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
30c60 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61  ->aData[8]), pPa
30c70 67 65 2c 20 31 2c 20 70 6e 43 68 61 6e 67 65 29  ge, 1, pnChange)
30c80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
30c90 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
30ca0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c  epage_out;.  }el
30cb0 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67 65 20  se if( pnChange 
30cc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
30cd0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
30ce0 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d      *pnChange +=
30cf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
30d00 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67   }.  if( freePag
30d10 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  eFlag ){.    rc 
30d20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
30d30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  );.  }else if( (
30d40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30d50 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
30d60 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20  bPage))==0 ){.  
30d70 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
30d80 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  , pPage->aData[0
30d90 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ] | PTF_LEAF);. 
30da0 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73   }..cleardatabas
30db0 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c  epage_out:.  rel
30dc0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
30dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30de0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
30df0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  l information fr
30e00 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  om a single tabl
30e10 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
30e20 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a  e.  iTable is.**
30e30 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
30e40 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   of the root of 
30e50 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65  the table.  Afte
30e60 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  r this routine r
30e70 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72  eturns,.** the r
30e80 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
30e90 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69  y, but still exi
30ea0 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sts..**.** This 
30eb0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
30ec0 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
30ed0 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
30ee0 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65  e any open.** re
30ef0 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ad cursors on th
30f00 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77  e table.  Open w
30f10 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
30f20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
30f30 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
30f40 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43  le..**.** If pnC
30f50 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  hange is not NUL
30f60 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20 69 54  L, then table iT
30f70 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6e 20  able must be an 
30f80 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20 54 68  intkey table. Th
30f90 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c  e.** integer val
30fa0 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ue pointed to by
30fb0 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69 6e 63   pnChange is inc
30fc0 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20  remented by the 
30fd0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74  number of.** ent
30fe0 72 69 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c  ries in the tabl
30ff0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
31000 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
31010 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
31020 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68  Table, int *pnCh
31030 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ange){.  int rc;
31040 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
31050 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
31060 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
31070 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
31080 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69  ->db;.  if( p->i
31090 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
310a0 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ITE ){.    rc = 
310b0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
310c0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
310d0 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
310e0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
310f0 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  = checkReadLocks
31100 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31  (p, iTable, 0, 1
31110 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
31120 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20  .    /* nothing 
31130 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65  to do */.  }else
31140 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
31150 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
31160 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65  sors(pBt, iTable
31170 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  , 0)) ){.    /* 
31180 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f  nothing to do */
31190 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
311a0 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
311b0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
311c0 69 54 61 62 6c 65 2c 20 30 2c 20 30 2c 20 70 6e  iTable, 0, 0, pn
311d0 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73  Change);.  }.  s
311e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
311f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
31200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
31210 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
31220 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
31230 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
31240 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
31250 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
31260 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
31270 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
31280 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
31290 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
312a0 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
312b0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
312c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
312d0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
312e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
312f0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
31300 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
31310 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
31320 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
31330 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
31340 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
31350 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
31360 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
31370 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
31380 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
31390 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
313a0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
313b0 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
313c0 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
313d0 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
313e0 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
313f0 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
31400 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
31410 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
31420 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
31430 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
31440 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
31450 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
31460 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
31470 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
31480 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
31490 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
314a0 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
314b0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
314c0 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
314d0 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
314e0 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
314f0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
31500 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
31510 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
31520 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
31530 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
31540 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
31550 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
31560 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
31570 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
31580 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
31590 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
315a0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
315b0 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
315c0 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
315d0 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74  procedure..*/.st
315e0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72  atic int btreeDr
315f0 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
31600 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
31610 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
31620 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
31630 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42   *pPage = 0;.  B
31640 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
31650 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
31660 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
31670 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
31680 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
31690 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
316a0 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
316b0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
316c0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
316d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
316e0 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
316f0 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
31700 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
31710 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
31720 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
31730 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
31740 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
31750 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
31760 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
31770 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
31780 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
31790 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
317a0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
317b0 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
317c0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
317d0 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
317e0 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
317f0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
31800 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
31810 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
31820 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
31830 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  D;.  }..  rc = s
31840 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
31850 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
31860 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29  able, &pPage, 0)
31870 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
31880 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
31890 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
318a0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c  Table(p, iTable,
318b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
318c0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
318d0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
318e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  urn rc;.  }..  *
318f0 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  piMoved = 0;..  
31900 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a  if( iTable>1 ){.
31910 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
31920 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31930 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
31940 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  pPage);.    rele
31950 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
31960 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42  #else.    if( pB
31970 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
31980 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52  .      Pgno maxR
31990 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72  ootPgno;.      r
319a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
319b0 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d  GetMeta(p, 4, &m
319c0 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
319d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
319e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
319f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31a00 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
31a10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
31a20 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65        if( iTable
31a30 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b  ==maxRootPgno ){
31a40 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
31a50 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
31a60 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61  ropped is the ta
31a70 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ble with the lar
31a80 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
31a90 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
31aa0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
31ab0 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70  , put the root p
31ac0 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20  age on the free 
31ad0 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
31ae0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
31af0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
31b00 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
31b10 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
31b20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31b40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
31b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
31b70 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
31b80 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74  dropped does not
31b90 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73   have the larges
31ba0 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
31bb0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
31bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53   the database. S
31bd0 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  o move the page 
31be0 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74  that does into t
31bf0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  he .        ** g
31c00 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
31c10 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65  eleted root-page
31c20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
31c30 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d       MemPage *pM
31c40 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ove;.        rel
31c50 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
31c60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31c70 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
31c80 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
31c90 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
31ca0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31cc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
31cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31ce0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
31cf0 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65  ePage(pBt, pMove
31d00 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
31d10 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30 29  E, 0, iTable, 0)
31d20 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
31d30 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
31d40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31d60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
31d70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31d90 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
31da0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
31db0 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
31dc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31dd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31de0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
31df0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
31e00 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65  = freePage(pMove
31e10 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
31e20 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
31e30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31e50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
31e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31e70 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61     *piMoved = ma
31e80 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
31e90 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
31ea0 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f   the new 'max-ro
31eb0 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69  ot-page' value i
31ec0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
31ed0 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20  eader. This.    
31ee0 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20    ** is the old 
31ef0 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20  value less one, 
31f00 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66  less one more if
31f10 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f   that happens to
31f20 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72  .      ** be a r
31f30 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c  oot-page number,
31f40 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20   less one again 
31f50 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  if that is the. 
31f60 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f       ** PENDING_
31f70 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20  BYTE_PAGE..     
31f80 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f   */.      maxRoo
31f90 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69  tPgno--;.      i
31fa0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
31fb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31fc0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
31fd0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
31fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31ff0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
32000 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
32010 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  t, maxRootPgno) 
32020 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
32030 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
32040 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
32050 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
32060 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32070 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
32080 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
32090 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
320a0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
320b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
320c0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
320d0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
320e0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
320f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
32100 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  lse{.    /* If s
32110 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
32120 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20  able was called 
32130 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
32140 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
32150 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
32160 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c  _LEAF );.    rel
32170 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
32180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
32190 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ;  .}.int sqlite
321a0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
321b0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
321c0 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
321d0 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
321e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
321f0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
32200 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
32210 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62  c = btreeDropTab
32220 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69  le(p, iTable, pi
32230 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  Moved);.  sqlite
32240 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
32250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32260 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
32270 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
32280 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61   out of a databa
32290 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30  se file.  Meta[0
322a0 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62  ].** is the numb
322b0 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  er of free pages
322c0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
322d0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
322e0 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20  a[1].** through 
322f0 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61  meta[15] are ava
32300 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62  ilable for use b
32310 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e  y higher layers.
32320 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
32330 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f  read-only, the o
32340 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77  thers are read/w
32350 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  rite..** .** The
32360 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75   schema layer nu
32370 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65  mbers meta value
32380 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20  s differently.  
32390 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a  At the schema.**
323a0 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20   layer (and the 
323b0 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65  SetCookie and Re
323c0 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73  adCookie opcodes
323d0 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  ) the number of.
323e0 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73  ** free pages is
323f0 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53   not visible.  S
32400 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74  o Cookie[0] is t
32410 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b  he same as Meta[
32420 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  1]..*/.int sqlit
32430 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42  e3BtreeGetMeta(B
32440 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  tree *p, int idx
32450 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20  , u32 *pMeta){. 
32460 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
32470 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
32480 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
32490 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
324a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
324b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
324c0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
324d0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65   p->db;..  /* Re
324e0 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74  ading a meta-dat
324f0 61 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73  a value requires
32500 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
32510 70 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63  page 1 (and henc
32520 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  e.  ** the sqlit
32530 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
32540 57 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63  We grab this loc
32550 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  k regardless of 
32560 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20  whether or.  ** 
32570 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52  not the SQLITE_R
32580 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
32590 6c 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20  lag is set (the 
325a0 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
325b0 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74  page.  ** 1 is t
325c0 72 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63  reated as a spec
325d0 69 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72  ial case by quer
325e0 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64  yTableLock() and
325f0 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20   lockTable()).. 
32600 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
32610 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20  TableLock(p, 1, 
32620 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
32630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32640 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
32650 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
32660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
32670 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
32680 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  0 && idx<=15 );.
32690 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
326a0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
326b0 62 2d 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  b-tree is alread
326c0 79 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  y holding a refe
326d0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
326e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
326f0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20      ** file. In 
32700 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65  this case the re
32710 71 75 69 72 65 64 20 6d 65 74 61 2d 64 61 74 61  quired meta-data
32720 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65   value can be re
32730 61 64 20 64 69 72 65 63 74 6c 79 0a 20 20 20 20  ad directly.    
32740 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ** from the page
32750 20 64 61 74 61 20 6f 66 20 74 68 69 73 20 72 65   data of this re
32760 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 69 73  ference. This is
32770 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
32780 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71   than.    ** req
32790 75 65 73 74 69 6e 67 20 61 20 6e 65 77 20 72 65  uesting a new re
327a0 66 65 72 65 6e 63 65 20 66 72 6f 6d 20 74 68 65  ference from the
327b0 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20   pager layer..  
327c0 20 20 2a 2f 0a 20 20 20 20 70 50 31 20 3d 20 28    */.    pP1 = (
327d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
327e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
327f0 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ta;.  }else{.   
32800 20 2f 2a 20 54 68 65 20 62 2d 74 72 65 65 20 64   /* The b-tree d
32810 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 72  oes not have a r
32820 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
32830 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
32840 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  se file..    ** 
32850 4f 62 74 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20  Obtain one from 
32860 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e  the pager layer.
32870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
32880 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
32890 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c  (pBt->pPager, 1,
328a0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
328b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
328c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
328d0 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
328e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
328f0 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64   pP1 = (unsigned
32900 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
32910 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
32920 61 67 65 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65  age);.  }.  *pMe
32930 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ta = get4byte(&p
32940 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b  P1[36 + idx*4]);
32950 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 2d  ..  /* If the b-
32960 74 72 65 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64  tree is not hold
32970 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
32980 74 6f 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  to page 1, then 
32990 6f 6e 65 20 77 61 73 20 0a 20 20 2a 2a 20 72 65  one was .  ** re
329a0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
329b0 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 6e 20   pager layer in 
329c0 74 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e  the above block.
329d0 20 52 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   Release it now.
329e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 74  .  */.  if( !pBt
329f0 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20  ->pPage1 ){.    
32a00 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
32a10 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  f(pDbPage);.  }.
32a20 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63  .  /* If autovac
32a30 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65  uumed is disable
32a40 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20  d in this build 
32a50 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  but we are tryin
32a60 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73  g to .  ** acces
32a70 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65  s an autovacuume
32a80 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  d database, then
32a90 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61   make the databa
32aa0 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20  se readonly. .  
32ab0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
32ac0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
32ad0 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26  .  if( idx==4 &&
32ae0 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d   *pMeta>0 ) pBt-
32af0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23  >readOnly = 1;.#
32b00 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62  endif..  /* Grab
32b10 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f   the read-lock o
32b20 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72  n page 1. */.  r
32b30 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
32b40 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
32b50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
32b60 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
32b70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
32b80 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  ite meta-informa
32b90 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tion back into t
32ba0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
32bb0 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64  ta[0] is.** read
32bc0 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f  -only and may no
32bd0 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  t be written..*/
32be0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
32bf0 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65  eUpdateMeta(Btre
32c00 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
32c10 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53  32 iMeta){.  BtS
32c20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c30 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
32c40 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74  char *pP1;.  int
32c50 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
32c60 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35  dx>=1 && idx<=15
32c70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
32c80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
32c90 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
32ca0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
32cb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
32cc0 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
32cd0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
32ce0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
32cf0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
32d00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
32d10 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a  t->pPage1!=0 );.
32d20 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70      pP1 = pBt->p
32d30 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
32d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32d50 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
32d60 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
32d70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
32d90 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  ut4byte(&pP1[36 
32da0 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29  + idx*4], iMeta)
32db0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32dc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
32dd0 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d  .      if( idx==
32de0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  7 ){.        ass
32df0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
32e00 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30  cuum || iMeta==0
32e10 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
32e20 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20  rt( iMeta==0 || 
32e30 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20  iMeta==1 );.    
32e40 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
32e50 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20  uum = iMeta;.   
32e60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32e70 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
32e80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
32e90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
32ea0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
32eb0 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20  lag byte at the 
32ec0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
32ed0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63   page that the c
32ee0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
32ef0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
32f00 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
32f10 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75  3BtreeFlags(BtCu
32f20 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
32f30 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f  * TODO: What abo
32f40 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  ut CURSOR_REQUIR
32f50 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f  ESEEK state? Pro
32f60 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61  bably need to ca
32f70 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43  ll.  ** restoreC
32f80 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
32f90 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d  here..  */.  Mem
32fa0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72  Page *pPage;.  r
32fb0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
32fc0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50  tion(pCur);.  pP
32fd0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
32fe0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
32ff0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
33000 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
33010 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
33020 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d  Page->pBt==pCur-
33030 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e  >pBt );.  return
33040 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d 3e   pPage ? pPage->
33050 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
33060 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a  Offset] : 0;.}..
33070 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
33080 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61 74  e pager associat
33090 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65 2e  ed with a BTree.
330a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
330b0 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
330c0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
330d0 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67  ing only..*/.Pag
330e0 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  er *sqlite3Btree
330f0 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b  Pager(Btree *p){
33100 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
33110 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66  ->pPager;.}..#if
33120 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33130 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
33140 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
33150 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 65  message to the e
33160 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
33170 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
33180 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d  oid checkAppendM
33190 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  sg(.  IntegrityC
331a0 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61  k *pCheck,.  cha
331b0 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73  r *zMsg1,.  cons
331c0 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
331d0 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c  .  ....){.  va_l
331e0 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70  ist ap;.  if( !p
331f0 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72  Check->mxErr ) r
33200 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d  eturn;.  pCheck-
33210 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65  >mxErr--;.  pChe
33220 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61  ck->nErr++;.  va
33230 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
33240 61 74 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63  at);.  if( pChec
33250 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68 61 72 20  k->errMsg.nChar 
33260 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  ){.    sqlite3St
33270 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43  rAccumAppend(&pC
33280 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 22 5c  heck->errMsg, "\
33290 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66  n", 1);.  }.  if
332a0 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20 20 20 73  ( zMsg1 ){.    s
332b0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
332c0 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72  pend(&pCheck->er
332d0 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31 29  rMsg, zMsg1, -1)
332e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
332f0 58 50 72 69 6e 74 66 28 26 70 43 68 65 63 6b 2d  XPrintf(&pCheck-
33300 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f 72  >errMsg, 1, zFor
33310 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
33320 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 70 43  nd(ap);.  if( pC
33330 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c  heck->errMsg.mal
33340 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
33350 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46   pCheck->mallocF
33360 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  ailed = 1;.  }.}
33370 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33380 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
33390 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
333a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
333b0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
333c0 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68  *.** Add 1 to th
333d0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
333e0 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65  t for page iPage
333f0 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
33400 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65  e second.** refe
33410 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
33420 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20  e, add an error 
33430 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63  message to pChec
33440 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52  k->zErrMsg..** R
33450 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
33460 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20   are 2 ore more 
33470 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
33480 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a  e page and 0 if.
33490 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
334a0 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63  e first referenc
334b0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a  e to the page..*
334c0 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20  *.** Also check 
334d0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
334e0 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64  mber is in bound
334f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
33500 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72   checkRef(Integr
33510 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69  ityCk *pCheck, i
33520 6e 74 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a  nt iPage, char *
33530 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28  zContext){.  if(
33540 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75   iPage==0 ) retu
33550 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67  rn 1;.  if( iPag
33560 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20  e>pCheck->nPage 
33570 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20  || iPage<0 ){.  
33580 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
33590 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
335a0 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65  t, "invalid page
335b0 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61   number %d", iPa
335c0 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
335d0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68  1;.  }.  if( pCh
335e0 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65  eck->anRef[iPage
335f0 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63  ]==1 ){.    chec
33600 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
33610 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e  k, zContext, "2n
33620 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  d reference to p
33630 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
33640 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
33650 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43   }.  return  (pC
33660 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67  heck->anRef[iPag
33670 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e  e]++)>1;.}..#ifn
33680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33690 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
336a0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
336b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
336c0 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67  nter-map for pag
336d0 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f  e iChild maps to
336e0 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e   .** page iParen
336f0 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20  t, pointer type 
33700 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c  ptrType. If not,
33710 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72   append an error
33720 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70   message.** to p
33730 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Check..*/.static
33740 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61   void checkPtrma
33750 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  p(.  IntegrityCk
33760 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49   *pCheck,   /* I
33770 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 20 63  ntegrity check c
33780 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f  ontext */.  Pgno
33790 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20   iChild,        
337a0 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65     /* Child page
337b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20   number */.  u8 
337c0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
337d0 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
337e0 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65  pointer map type
337f0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65   */.  Pgno iPare
33800 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt,          /* 
33810 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72  Expected pointer
33820 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61 67 65   map parent page
33830 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
33840 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20  r *zContext     
33850 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64      /* Context d
33860 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64  escription (used
33870 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20   for error msg) 
33880 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
33890 20 20 75 38 20 65 50 74 72 6d 61 70 54 79 70 65    u8 ePtrmapType
338a0 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  ;.  Pgno iPtrmap
338b0 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20  Parent;..  rc = 
338c0 70 74 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b  ptrmapGet(pCheck
338d0 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26  ->pBt, iChild, &
338e0 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50  ePtrmapType, &iP
338f0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
33900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33910 4b 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  K ){.    checkAp
33920 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
33930 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65  zContext, "Faile
33940 64 20 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70  d to read ptrmap
33950 20 6b 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64   key=%d", iChild
33960 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
33970 20 7d 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61   }..  if( ePtrma
33980 70 54 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20  pType!=eType || 
33990 69 50 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69  iPtrmapParent!=i
339a0 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68  Parent ){.    ch
339b0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
339c0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  eck, zContext, .
339d0 20 20 20 20 20 20 22 42 61 64 20 70 74 72 20 6d        "Bad ptr m
339e0 61 70 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20  ap entry key=%d 
339f0 65 78 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29  expected=(%d,%d)
33a00 20 67 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a   got=(%d,%d)", .
33a10 20 20 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54        iChild, eT
33a20 79 70 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50  ype, iParent, eP
33a30 74 72 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d  trmapType, iPtrm
33a40 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d  apParent);.  }.}
33a50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
33a60 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
33a70 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
33a80 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72  st or of an over
33a90 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a  flow page list..
33aa0 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
33ab0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
33ac0 65 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69  es on the list i
33ad0 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  s N..*/.static v
33ae0 6f 69 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20  oid checkList(. 
33af0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
33b00 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72  heck,  /* Integr
33b10 69 74 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e  ity checking con
33b20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  text */.  int is
33b30 46 72 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20  FreeList,       
33b40 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 66 72  /* True for a fr
33b50 65 65 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66  eelist.  False f
33b60 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
33b70 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
33b80 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
33b90 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
33ba0 66 6f 72 20 66 69 72 73 74 20 70 61 67 65 20 69  for first page i
33bb0 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
33bc0 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
33bd0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
33be0 64 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  d number of page
33bf0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  s in the list */
33c00 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  .  char *zContex
33c10 74 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  t        /* Cont
33c20 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
33c30 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssages */.){.  i
33c40 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65  nt i;.  int expe
33c50 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20  cted = N;.  int 
33c60 69 46 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a  iFirst = iPage;.
33c70 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30    while( N-- > 0
33c80 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72   && pCheck->mxEr
33c90 72 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  r ){.    DbPage 
33ca0 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20  *pOvflPage;.    
33cb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
33cc0 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66  OvflData;.    if
33cd0 28 20 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20  ( iPage<1 ){.   
33ce0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33cf0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
33d00 78 74 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64  xt,.         "%d
33d10 20 6f 66 20 25 64 20 70 61 67 65 73 20 6d 69 73   of %d pages mis
33d20 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c  sing from overfl
33d30 6f 77 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ow list starting
33d40 20 61 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20   at %d",.       
33d50 20 20 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64     N+1, expected
33d60 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20  , iFirst);.     
33d70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
33d80 20 20 69 66 28 20 63 68 65 63 6b 52 65 66 28 70    if( checkRef(p
33d90 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43  Check, iPage, zC
33da0 6f 6e 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b  ontext) ) break;
33db0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
33dc0 50 61 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d  PagerGet(pCheck-
33dd0 3e 70 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69  >pPager, (Pgno)i
33de0 50 61 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65  Page, &pOvflPage
33df0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
33e00 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
33e10 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69  , zContext, "fai
33e20 6c 65 64 20 74 6f 20 67 65 74 20 70 61 67 65 20  led to get page 
33e30 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
33e40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
33e50 20 20 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20      pOvflData = 
33e60 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
33e70 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
33e80 44 61 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b  Data(pOvflPage);
33e90 0a 20 20 20 20 69 66 28 20 69 73 46 72 65 65 4c  .    if( isFreeL
33ea0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
33eb0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
33ec0 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69  OvflData[4]);.#i
33ed0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33ee0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33ef0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
33f00 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
33f10 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
33f20 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50  trmap(pCheck, iP
33f30 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
33f40 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78  PAGE, 0, zContex
33f50 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
33f60 69 66 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70  if.      if( n>p
33f70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62  Check->pBt->usab
33f80 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20  leSize/4-2 ){.  
33f90 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
33fa0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
33fb0 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
33fc0 20 20 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66    "freelist leaf
33fd0 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f   count too big o
33fe0 6e 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  n page %d", iPag
33ff0 65 29 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b  e);.        N--;
34000 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34010 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
34020 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
34030 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61      Pgno iFreePa
34040 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
34050 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29  OvflData[8+i*4])
34060 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
34070 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
34080 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
34090 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
340a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
340b0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
340c0 70 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  p(pCheck, iFreeP
340d0 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
340e0 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78  PAGE, 0, zContex
340f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
34100 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
34110 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
34120 2c 20 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f  , iFreePage, zCo
34130 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
34140 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e  }.        N -= n
34150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34160 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34170 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
34180 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
34190 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
341a0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
341b0 2d 76 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67  -vacuum and iPag
341c0 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  e is not the las
341d0 74 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  t.      ** page 
341e0 69 6e 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  in this overflow
341f0 20 6c 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61   list, check tha
34200 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
34210 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20  p entry for.    
34220 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
34230 6e 67 20 70 61 67 65 20 6d 61 74 63 68 65 73 20  ng page matches 
34240 69 50 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  iPage..      */.
34250 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
34260 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
34270 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20  m && N>0 ){.    
34280 20 20 20 20 69 20 3d 20 67 65 74 34 62 79 74 65      i = get4byte
34290 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20  (pOvflData);.   
342a0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
342b0 28 70 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d  (pCheck, i, PTRM
342c0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50  AP_OVERFLOW2, iP
342d0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
342e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
342f0 6e 64 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d  ndif.    iPage =
34300 20 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44   get4byte(pOvflD
34310 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
34320 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
34330 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  lPage);.  }.}.#e
34340 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
34350 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
34360 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
34370 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
34380 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
34390 2a 20 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e  * Do various san
343a0 69 74 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20  ity checks on a 
343b0 73 69 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61  single page of a
343c0 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a   tree.  Return.*
343d0 2a 20 74 68 65 20 74 72 65 65 20 64 65 70 74 68  * the tree depth
343e0 2e 20 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65  .  Root pages re
343f0 74 75 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73  turn 0.  Parents
34400 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a   of root pages.*
34410 2a 20 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20  * return 1, and 
34420 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a  so forth..** .**
34430 20 54 68 65 73 65 20 63 68 65 63 6b 73 20 61 72   These checks ar
34440 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e done:.**.**   
34450 20 20 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65     1.  Make sure
34460 20 74 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20   that cells and 
34470 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f  freeblocks do no
34480 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20  t overlap.**    
34490 20 20 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e        but combin
344a0 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
344b0 63 6f 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a  cover the page..
344c0 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65  **  NO  2.  Make
344d0 20 73 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20   sure cell keys 
344e0 61 72 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a  are in order..**
344f0 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73    NO  3.  Make s
34500 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65  ure no key is le
34510 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
34520 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e   to zLowerBound.
34530 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b  .**  NO  4.  Mak
34540 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
34550 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
34560 20 65 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72   equal to zUpper
34570 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35  Bound..**      5
34580 2e 20 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  .  Check the int
34590 65 67 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c  egrity of overfl
345a0 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20  ow pages..**    
345b0 20 20 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c    6.  Recursivel
345c0 79 20 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65  y call checkTree
345d0 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c  Page on all chil
345e0 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e  dren..**      7.
345f0 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
34600 65 20 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63  e depth of all c
34610 68 69 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73  hildren is the s
34620 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20  ame..**      8. 
34630 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   Make sure this 
34640 70 61 67 65 20 69 73 20 61 74 20 6c 65 61 73 74  page is at least
34650 20 33 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73   33% full or els
34660 65 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20  e it is.**      
34670 20 20 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20      the root of 
34680 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61  the tree..*/.sta
34690 74 69 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65  tic int checkTre
346a0 65 50 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69  ePage(.  Integri
346b0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
346c0 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68  * Context for th
346d0 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a  e sanity check *
346e0 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20  /.  int iPage,  
346f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
34700 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
34710 70 61 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  page to check */
34720 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
34730 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
34740 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61  nt page */.  cha
34750 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  r *zParentContex
34760 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e  t  /* Parent con
34770 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  text */.){.  Mem
34780 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69  Page *pPage;.  i
34790 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c  nt i, rc, depth,
347a0 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a   d2, pgno, cnt;.
347b0 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53    int hdr, cellS
347c0 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  tart;.  int nCel
347d0 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20  l;.  u8 *data;. 
347e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
347f0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
34800 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78  ;.  char zContex
34810 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a  t[100];.  char *
34820 68 69 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  hit = 0;..  sqli
34830 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
34840 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
34850 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25  Context, "Page %
34860 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20  d: ", iPage);.. 
34870 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
34880 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20  he page exists. 
34890 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65   */.  pBt = pChe
348a0 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c  ck->pBt;.  usabl
348b0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
348c0 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69  bleSize;.  if( i
348d0 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
348e0 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52   0;.  if( checkR
348f0 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
34900 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74  , zParentContext
34910 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
34920 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
34930 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
34940 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20  t, (Pgno)iPage, 
34950 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29  &pPage, 0))!=0 )
34960 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
34970 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
34980 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75  ntext,.       "u
34990 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65  nable to get the
349a0 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64   page. error cod
349b0 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e=%d", rc);.    
349c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
349d0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
349e0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
349f0 50 61 67 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  Page))!=0 ){.   
34a00 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
34a10 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
34a20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
34a30 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74        "sqlite3Bt
34a40 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65  reeInitPage() re
34a50 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65  turns error code
34a60 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72   %d", rc);.    r
34a70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
34a80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
34a90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
34aa0 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c   out all the cel
34ab0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68  ls..  */.  depth
34ac0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
34ad0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   i<pPage->nCell 
34ae0 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
34af0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
34b00 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
34b10 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
34b20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
34b30 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
34b40 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
34b50 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
34b60 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
34b70 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
34b80 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
34b90 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64  "On tree page %d
34ba0 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61   cell %d: ", iPa
34bb0 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c  ge, i);.    pCel
34bc0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
34bd0 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge,i);.    sqlit
34be0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
34bf0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
34c00 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a  , &info);.    sz
34c10 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20   = info.nData;. 
34c20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
34c30 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e  ntKey ) sz += in
34c40 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73  fo.nKey;.    ass
34c50 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50  ert( sz==info.nP
34c60 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66  ayload );.    if
34c70 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ( sz>info.nLocal
34c80 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
34c90 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f  age = (sz - info
34ca0 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65  .nLocal + usable
34cb0 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c  Size - 5)/(usabl
34cc0 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
34cd0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
34ce0 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
34cf0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
34d00 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
34d10 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
34d20 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
34d30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
34d40 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
34d50 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
34d60 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
34d70 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a  RFLOW1, iPage, z
34d80 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
34d90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
34da0 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c  heckList(pCheck,
34db0 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50   0, pgnoOvfl, nP
34dc0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
34dd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
34de0 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65  eck sanity of le
34df0 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ft child page.. 
34e00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
34e10 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
34e20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
34e30 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e  yte(pCell);.#ifn
34e40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34e50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
34e60 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34e70 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
34e80 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
34e90 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
34ea0 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a  _BTREE, iPage, z
34eb0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
34ec0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  }.#endif.      d
34ed0 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67  2 = checkTreePag
34ee0 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50  e(pCheck,pgno,pP
34ef0 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  age,zContext);. 
34f00 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
34f10 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20  d2!=depth ){.   
34f20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
34f30 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
34f40 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67  text, "Child pag
34f50 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22  e depth differs"
34f60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34f70 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20   depth = d2;.   
34f80 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50   }.  }.  if( !pP
34f90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
34fa0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
34fb0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
34fc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
34fd0 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  8]);.    sqlite3
34fe0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
34ff0 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
35000 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
35010 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
35020 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74  page %d at right
35030 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65   child: ", iPage
35040 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
35050 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
35060 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
35070 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
35080 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
35090 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
350a0 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
350b0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
350c0 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
350d0 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
350e0 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65  o, pPage, zConte
350f0 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  xt);.  }. .  /* 
35100 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65  Check for comple
35110 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74  te coverage of t
35120 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64  he page.  */.  d
35130 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
35140 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
35150 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
35160 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  hit = sqlite3Pag
35170 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
35180 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
35190 68 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  hit==0 ){.    pC
351a0 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  heck->mallocFail
351b0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
351c0 0a 20 20 20 20 75 31 36 20 63 6f 6e 74 65 6e 74  .    u16 content
351d0 4f 66 66 73 65 74 20 3d 20 67 65 74 32 62 79 74  Offset = get2byt
351e0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
351f0 0a 20 20 20 20 69 66 20 28 63 6f 6e 74 65 6e 74  .    if (content
35200 4f 66 66 73 65 74 20 3e 20 75 73 61 62 6c 65 53  Offset > usableS
35210 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 63 68 65  ize) {.      che
35220 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
35230 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ck, 0, .        
35240 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f               "Co
35250 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65  rruption detecte
35260 64 20 69 6e 20 68 65 61 64 65 72 20 6f 6e 20 70  d in header on p
35270 61 67 65 20 25 64 22 2c 69 50 61 67 65 2c 30 29  age %d",iPage,0)
35280 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 68 65  ;.      goto che
35290 63 6b 5f 70 61 67 65 5f 61 62 6f 72 74 3b 0a 20  ck_page_abort;. 
352a0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
352b0 68 69 74 2b 63 6f 6e 74 65 6e 74 4f 66 66 73 65  hit+contentOffse
352c0 74 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65  t, 0, usableSize
352d0 2d 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 29 3b  -contentOffset);
352e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
352f0 20 31 2c 20 63 6f 6e 74 65 6e 74 4f 66 66 73 65   1, contentOffse
35300 74 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  t);.    nCell = 
35310 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
35320 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
35330 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
35340 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
35350 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
35360 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
35370 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
35380 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
35390 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
353a0 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20 31 30     u16 size = 10
353b0 32 34 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  24;.      int j;
353c0 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 3d 75  .      if( pc<=u
353d0 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
353e0 20 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c       size = cell
353f0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
35400 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
35410 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 63   }.      if( (pc
35420 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
35430 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
35440 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
35450 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
35460 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
35470 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
35480 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
35490 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
354a0 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
354b0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
354c0 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
354d0 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
354e0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
354f0 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
35500 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
35510 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
35520 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
35530 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
35540 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
35550 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
35560 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
35570 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
35580 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
35590 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
355a0 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
355b0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
355c0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
355d0 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
355e0 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
355f0 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
35600 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
35610 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
35620 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
35630 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
35640 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
35650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35660 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
35670 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
35680 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
35690 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
356a0 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
356b0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
356c0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
356d0 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
356e0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
356f0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
35700 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
35710 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
35720 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
35730 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
35740 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
35750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35760 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
35770 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
35780 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
35790 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
357a0 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
357b0 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
357c0 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
357d0 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
357e0 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
357f0 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
35800 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 63 68  e);.    }.  }.ch
35810 65 63 6b 5f 70 61 67 65 5f 61 62 6f 72 74 3a 0a  eck_page_abort:.
35820 20 20 69 66 20 28 68 69 74 29 20 73 71 6c 69 74    if (hit) sqlit
35830 65 33 50 61 67 65 46 72 65 65 28 68 69 74 29 3b  e3PageFree(hit);
35840 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
35850 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
35860 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64   depth+1;.}.#end
35870 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
35880 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
35890 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
358a0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
358b0 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
358c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
358d0 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65  s a complete che
358e0 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ck of the given 
358f0 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f  BTree file.  aRo
35900 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72  ot[] is.** an ar
35910 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d  ray of pages num
35920 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20 70  bers were each p
35930 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68  age number is th
35940 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a  e root page of.*
35950 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f  * a table.  nRoo
35960 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
35970 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52  of entries in aR
35980 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  oot..**.** Write
35990 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
359a0 72 72 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70 6e  rror seen in *pn
359b0 45 72 72 2e 20 20 45 78 63 65 70 74 20 66 6f 72  Err.  Except for
359c0 20 73 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20   some memory.** 
359d0 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
359e0 73 2c 20 20 6e 6e 20 65 72 72 6f 72 20 6d 65 73  s,  nn error mes
359f0 73 61 67 65 20 69 73 20 68 65 6c 64 20 69 6e 20  sage is held in 
35a00 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
35a10 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 69  from.** malloc i
35a20 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 2a 70  s returned if *p
35a30 6e 45 72 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  nErr is non-zero
35a40 2e 20 20 49 66 20 2a 70 6e 45 72 72 3d 3d 30 20  .  If *pnErr==0 
35a50 74 68 65 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  then NULL is.** 
35a60 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
35a70 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49  r *sqlite3BtreeI
35a80 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20  ntegrityCheck(. 
35a90 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f   Btree *p,     /
35aa0 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 62  * The btree to b
35ab0 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69  e checked */.  i
35ac0 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20  nt *aRoot,   /* 
35ad0 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74  An array of root
35ae0 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66   pages numbers f
35af0 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72  or individual tr
35b00 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  ees */.  int nRo
35b10 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ot,    /* Number
35b20 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
35b30 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Root[] */.  int 
35b40 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f  mxErr,    /* Sto
35b50 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f  p reporting erro
35b60 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d 61  rs after this ma
35b70 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ny */.  int *pnE
35b80 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e  rr    /* Write n
35b90 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
35ba0 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72  seen to this var
35bb0 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  iable */.){.  in
35bc0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b  t i;.  int nRef;
35bd0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73  .  IntegrityCk s
35be0 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65  Check;.  BtShare
35bf0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
35c00 0a 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30  .  char zErr[100
35c10 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ];..  sqlite3Btr
35c20 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
35c30 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
35c40 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
35c50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
35c60 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
35c70 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
35c80 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f  try(p)!=SQLITE_O
35c90 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72 20  K ){.    *pnErr 
35ca0 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
35cb0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
35cc0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
35cd0 33 44 62 53 74 72 44 75 70 28 30 2c 20 22 63 61  3DbStrDup(0, "ca
35ce0 6e 6e 6f 74 20 61 63 71 75 69 72 65 20 61 20 72  nnot acquire a r
35cf0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
35d00 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a  database");.  }.
35d10 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70    sCheck.pBt = p
35d20 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61  Bt;.  sCheck.pPa
35d30 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
35d40 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  r;.  sCheck.nPag
35d50 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
35d60 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72  nt(sCheck.pPager
35d70 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72  );.  sCheck.mxEr
35d80 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68  r = mxErr;.  sCh
35d90 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20  eck.nErr = 0;.  
35da0 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69  sCheck.mallocFai
35db0 6c 65 64 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72  led = 0;.  *pnEr
35dc0 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  r = 0;.#ifndef S
35dd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
35de0 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
35df0 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20  >nTrunc!=0 ){.  
35e00 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d    sCheck.nPage =
35e10 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
35e20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
35e30 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29  Check.nPage==0 )
35e40 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  {.    unlockBtre
35e50 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
35e60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
35e70 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
35e80 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43  turn 0;.  }.  sC
35e90 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c  heck.anRef = sql
35ea0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68  ite3Malloc( (sCh
35eb0 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a  eck.nPage+1)*siz
35ec0 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66  eof(sCheck.anRef
35ed0 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73  [0]) );.  if( !s
35ee0 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20  Check.anRef ){. 
35ef0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
35f00 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
35f10 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20   *pnErr = 1;.   
35f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
35f30 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
35f40 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
35f50 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =0; i<=sCheck.nP
35f60 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63  age; i++){ sChec
35f70 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20  k.anRef[i] = 0; 
35f80 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f  }.  i = PENDING_
35f90 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a  BYTE_PAGE(pBt);.
35fa0 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e    if( i<=sCheck.
35fb0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68  nPage ){.    sCh
35fc0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31  eck.anRef[i] = 1
35fd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
35fe0 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 43 68  trAccumInit(&sCh
35ff0 65 63 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72 72  eck.errMsg, zErr
36000 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20  , sizeof(zErr), 
36010 32 30 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43 68  20000);..  /* Ch
36020 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
36030 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
36040 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69  t.  */.  checkLi
36050 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67  st(&sCheck, 1, g
36060 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
36070 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
36080 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65  ,.            ge
36090 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
360a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c  ge1->aData[36]),
360b0 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a   "Main freelist:
360c0 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b   ");..  /* Check
360d0 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e   all the tables.
360e0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
360f0 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65   i<nRoot && sChe
36100 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
36110 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d      if( aRoot[i]
36120 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
36130 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36140 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
36150 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
36160 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b  Vacuum && aRoot[
36170 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68  i]>1 ){.      ch
36180 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63  eckPtrmap(&sChec
36190 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52  k, aRoot[i], PTR
361a0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
361b0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
361c0 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  f.    checkTreeP
361d0 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  age(&sCheck, aRo
361e0 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20  ot[i], 0, "List 
361f0 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22  of tree roots: "
36200 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
36210 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67  e sure every pag
36220 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  e in the file is
36230 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f   referenced.  */
36240 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73  .  for(i=1; i<=s
36250 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73  Check.nPage && s
36260 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
36270 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
36280 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36290 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
362a0 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20  anRef[i]==0 ){. 
362b0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
362c0 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
362d0 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65  "Page %d is neve
362e0 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20  r used", i);.   
362f0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20   }.#else.    /* 
36300 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
36310 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
36320 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20  cuum, make sure 
36330 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69  no tables contai
36340 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  n.    ** referen
36350 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d  ces to pointer-m
36360 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f  ap pages..    */
36370 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
36380 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a  anRef[i]==0 && .
36390 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
363a0 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69  AGENO(pBt, i)!=i
363b0 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61   || !pBt->autoVa
363c0 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63  cuum) ){.      c
363d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
363e0 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20  Check, 0, "Page 
363f0 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  %d is never used
36400 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", i);.    }.   
36410 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65   if( sCheck.anRe
36420 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20  f[i]!=0 && .    
36430 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e     (PTRMAP_PAGEN
36440 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20  O(pBt, i)==i && 
36450 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
36460 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
36470 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
36480 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61  , 0, "Pointer ma
36490 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66  p page %d is ref
364a0 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20  erenced", i);.  
364b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
364c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
364d0 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64  his analysis did
364e0 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75   not leave any u
364f0 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a  nref() pages.  *
36500 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  /.  unlockBtreeI
36510 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
36520 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69  if( nRef != sqli
36530 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
36540 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
36550 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
36560 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
36570 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64  .      "Outstand
36580 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67  ing page count g
36590 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  oes from %d to %
365a0 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e  d during this an
365b0 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e  alysis",.      n
365c0 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65  Ref, sqlite3Page
365d0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
365e0 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
365f0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75  }..  /* Clean  u
36600 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72  p and report err
36610 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ors..  */.  sqli
36620 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
36630 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
36640 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a  (sCheck.anRef);.
36650 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6d 61 6c    if( sCheck.mal
36660 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
36670 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
36680 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72  Reset(&sCheck.er
36690 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45 72  rMsg);.    *pnEr
366a0 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 2b  r = sCheck.nErr+
366b0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
366c0 0a 20 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d 20  .  }.  *pnErr = 
366d0 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69  sCheck.nErr;.  i
366e0 66 28 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d  f( sCheck.nErr==
366f0 30 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  0 ) sqlite3StrAc
36700 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b  cumReset(&sCheck
36710 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75  .errMsg);.  retu
36720 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  rn sqlite3StrAcc
36730 75 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63 6b  umFinish(&sCheck
36740 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64  .errMsg);.}.#end
36750 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
36760 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
36770 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
36780 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
36790 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
367a0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
367b0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
367c0 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69  pager filename i
367d0 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
367e0 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
367f0 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
36800 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
36810 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
36820 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
36830 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
36840 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
36850 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  lename(Btree *p)
36860 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
36870 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
36880 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
36890 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
368a0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
368b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
368c0 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  the pathname of 
368d0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
368e0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
368f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
36900 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64  *.** The pager d
36910 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73  irectory name is
36920 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f   invariant as lo
36930 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ng as the pager 
36940 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74  is.** open so it
36950 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65   is safe to acce
36960 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42  ss without the B
36970 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a  tShared mutex..*
36980 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
36990 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
369a0 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
369b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
369c0 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
369d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
369e0 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70  agerDirname(p->p
369f0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
36a00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
36a10 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
36a20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
36a30 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e  r this database.
36a40 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76   The return.** v
36a50 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75  alue of this rou
36a60 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65  tine is the same
36a70 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
36a80 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  hether the journ
36a90 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  al file.** has b
36aa0 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e  een created or n
36ab0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ot..**.** The pa
36ac0 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ger journal file
36ad0 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e  name is invarian
36ae0 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  t as long as the
36af0 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65   pager is.** ope
36b00 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20  n so it is safe 
36b10 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75  to access withou
36b20 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d  t the BtShared m
36b30 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  utex..*/.const c
36b40 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
36b50 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
36b60 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
36b70 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
36b80 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
36b90 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  rn sqlite3PagerJ
36ba0 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42  ournalname(p->pB
36bb0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23  t->pPager);.}..#
36bc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36bd0 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
36be0 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74  Copy the complet
36bf0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74  e content of pBt
36c00 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e  From into pBtTo.
36c10 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a    A transaction.
36c20 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  ** must be activ
36c30 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73  e for both files
36c40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ..**.** The size
36c50 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79   of file pTo may
36c60 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20 74   be reduced by t
36c70 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
36c80 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
36c90 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72  es wrong, the tr
36ca0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f  ansaction on pTo
36cb0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
36cc0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
36cd0 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61  ssful, CommitPha
36ce0 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63  seOne() may be c
36cf0 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66  alled on pTo bef
36d00 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a  ore returning. .
36d10 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
36d20 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d  ould finish comm
36d30 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  itting the trans
36d40 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79  action on pTo by
36d50 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
36d60 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
36d70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36d80 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74  btreeCopyFile(Bt
36d90 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20  ree *pTo, Btree 
36da0 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72  *pFrom){.  int r
36db0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36dc0 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f   Pgno i;..  Pgno
36dd0 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20   nFromPage;     
36de0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
36df0 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20  es in pFrom */. 
36e00 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20   Pgno nToPage;  
36e10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36e20 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a  f pages in pTo *
36e30 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67  /.  Pgno nNewPag
36e40 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  e;      /* Numbe
36e50 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54  r of pages in pT
36e60 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f 70 79  o after the copy
36e70 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69   */..  Pgno iSki
36e80 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65  p;         /* Pe
36e90 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67 65 20  nding byte page 
36ea0 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20  in pTo */.  int 
36eb0 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20  nToPageSize;    
36ec0 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20  /* Page size of 
36ed0 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  pTo in bytes */.
36ee0 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53    int nFromPageS
36ef0 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69  ize;  /* Page si
36f00 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62  ze of pFrom in b
36f10 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61  ytes */..  BtSha
36f20 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f  red *pBtTo = pTo
36f30 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65  ->pBt;.  BtShare
36f40 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72  d *pBtFrom = pFr
36f50 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f  om->pBt;.  pBtTo
36f60 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a  ->db = pTo->db;.
36f70 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20    pBtFrom->db = 
36f80 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54  pFrom->db;..  nT
36f90 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54  oPageSize = pBtT
36fa0 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e  o->pageSize;.  n
36fb0 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70  FromPageSize = p
36fc0 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65  BtFrom->pageSize
36fd0 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e  ;..  if( pTo->in
36fe0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
36ff0 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54  TE || pFrom->inT
37000 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
37010 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
37020 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
37030 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70  }.  if( pBtTo->p
37040 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65  Cursor ){.    re
37050 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
37060 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65  ;.  }..  nToPage
37070 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
37080 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  t(pBtTo->pPager)
37090 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d 20  ;.  nFromPage = 
370a0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
370b0 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b  BtFrom->pPager);
370c0 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49  .  iSkip = PENDI
370d0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
370e0 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  To);..  /* Varia
370f0 62 6c 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20  ble nNewPage is 
37100 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
37110 67 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ges required to 
37120 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63  store the.  ** c
37130 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d  ontents of pFrom
37140 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
37150 6e 74 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  nt page-size of 
37160 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77  pTo..  */.  nNew
37170 50 61 67 65 20 3d 20 28 28 69 36 34 29 6e 46 72  Page = ((i64)nFr
37180 6f 6d 50 61 67 65 20 2a 20 28 69 36 34 29 6e 46  omPage * (i64)nF
37190 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20 28 69  romPageSize + (i
371a0 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d  64)nToPageSize -
371b0 20 31 29 20 2f 20 0a 20 20 20 20 20 20 28 69 36   1) / .      (i6
371c0 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a  4)nToPageSize;..
371d0 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
371e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d  QLITE_OK && (i<=
371f0 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e  nToPage || i<=nN
37200 65 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a  ewPage); i++){..
37210 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74      /* Journal t
37220 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
37230 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
37240 69 53 6b 69 70 20 69 73 20 74 68 65 20 70 61 67  iSkip is the pag
37250 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
37260 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 28 50 45  locking page (PE
37270 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 29  NDING_BYTE_PAGE)
37280 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61 74 61 62  .    ** in datab
37290 61 73 65 20 2a 70 54 6f 20 28 62 65 66 6f 72 65  ase *pTo (before
372a0 20 74 68 65 20 63 6f 70 79 29 2e 20 54 68 69 73   the copy). This
372b0 20 70 61 67 65 20 69 73 20 6e 65 76 65 72 20 77   page is never w
372c0 72 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69  ritten .    ** i
372d0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
372e0 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d  file. Unless i==
372f0 69 53 6b 69 70 20 6f 72 20 74 68 65 20 70 61 67  iSkip or the pag
37300 65 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  e was not.    **
37310 20 70 72 65 73 65 6e 74 20 69 6e 20 70 54 6f 20   present in pTo 
37320 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20  before the copy 
37330 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e  operation, journ
37340 61 6c 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  al page i from p
37350 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  To..    */.    i
37360 66 28 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69  f( i!=iSkip && i
37370 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20  <=nToPage ){.   
37380 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
37390 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ge = 0;.      rc
373a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
373b0 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  et(pBtTo->pPager
373c0 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , i, &pDbPage);.
373d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
373e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
373f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37400 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
37410 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
37420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
37430 20 69 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a   i>nFromPage ){.
37440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 59 65 61            /* Yea
37450 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69 65  h.  It seems wie
37460 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57  rd to call DontW
37470 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66 74  rite() right aft
37480 65 72 20 57 72 69 74 65 28 29 2e 20 42 75 74 0a  er Write(). But.
37490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
374a0 74 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  t is because the
374b0 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20   names of those 
374c0 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f  procedures do no
374d0 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20 20  t exactly .     
374e0 20 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e       ** represen
374f0 74 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20  t what they do. 
37500 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20   Write() really 
37510 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69 73 20  means "put this 
37520 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20  page in the.    
37530 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
37540 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61  k journal and ma
37550 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20 73  rk it as dirty s
37560 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
37570 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  e written.      
37580 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61      ** to the da
37590 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65  tabase file late
375a0 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29  r."  DontWrite()
375b0 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f   undoes the seco
375c0 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20 20 20  nd part of.     
375d0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 64       ** that and
375e0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
375f0 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  ge from being wr
37600 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
37610 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20 20  abase. The.     
37620 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
37630 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c  still on the rol
37640 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
37650 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74  hough.  And that
37660 20 69 73 20 74 68 65 20 0a 20 20 20 20 20 20 20   is the .       
37670 20 20 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e     ** whole poin
37680 74 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a  t of this block:
37690 20 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e   to put pages on
376a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
376b0 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20 20  urnal. .        
376c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
376d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
376e0 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61 67  DontWrite(pDbPag
376f0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
37700 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
37710 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
37720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37730 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
37740 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 70 61  e the data in pa
37750 67 65 20 69 20 6f 66 20 74 68 65 20 74 61 72 67  ge i of the targ
37760 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  et database */. 
37770 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37780 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69 70  E_OK && i!=iSkip
37790 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20   && i<=nNewPage 
377a0 29 7b 0a 0a 20 20 20 20 20 20 44 62 50 61 67 65  ){..      DbPage
377b0 20 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20   *pToPage = 0;. 
377c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
377d0 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20  64 iOff;..      
377e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
377f0 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67  rGet(pBtTo->pPag
37800 65 72 2c 20 69 2c 20 26 70 54 6f 50 61 67 65 29  er, i, &pToPage)
37810 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
37820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37840 33 50 61 67 65 72 57 72 69 74 65 28 70 54 6f 50  3PagerWrite(pToP
37850 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  age);.      }.. 
37860 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20       for(.      
37870 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f    iOff=(i-1)*nTo
37880 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
37890 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
378a0 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61   && iOff<i*nToPa
378b0 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20  geSize; .       
378c0 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61   iOff += nFromPa
378d0 67 65 53 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a  geSize.      ){.
378e0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
378f0 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20  pFromPage = 0;. 
37900 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f         Pgno iFro
37910 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50  m = (iOff/nFromP
37920 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20  ageSize)+1;..   
37930 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
37940 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
37950 45 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20  E(pBtFrom) ){.  
37960 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
37970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
37980 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37990 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f  3PagerGet(pBtFro
379a0 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d  m->pPager, iFrom
379b0 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  , &pFromPage);. 
379c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
379d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
379e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 20        char *zTo 
379f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
37a00 74 44 61 74 61 28 70 54 6f 50 61 67 65 29 3b 0a  tData(pToPage);.
37a10 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
37a20 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50  zFrom = sqlite3P
37a30 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f  agerGetData(pFro
37a40 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
37a50 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20    int nCopy;..  
37a60 20 20 20 20 20 20 20 20 69 66 28 20 6e 46 72 6f          if( nFro
37a70 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61  mPageSize>=nToPa
37a80 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
37a90 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28        zFrom += (
37aa0 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a  (i-1)*nToPageSiz
37ab0 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e  e - ((iFrom-1)*n
37ac0 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a  FromPageSize));.
37ad0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70              nCop
37ae0 79 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b  y = nToPageSize;
37af0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
37b00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
37b10 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29  o += (((iFrom-1)
37b20 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 20  *nFromPageSize) 
37b30 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53  - (i-1)*nToPageS
37b40 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
37b50 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50    nCopy = nFromP
37b60 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
37b70 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
37b80 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f  memcpy(zTo, zFro
37b90 6d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  m, nCopy);.     
37ba0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
37bb0 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67 65  rUnref(pFromPage
37bc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37bd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
37be0 70 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20  pToPage ){.     
37bf0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
37c00 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
37c10 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
37c20 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pToPage);.      
37c30 20 20 70 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b    p->isInit = 0;
37c40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37c50 50 61 67 65 72 55 6e 72 65 66 28 70 54 6f 50 61  PagerUnref(pToPa
37c60 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
37c70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
37c80 74 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72 6b  things have work
37c90 65 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20 64  ed so far, the d
37ca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
37cb0 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20 2a   need to be .  *
37cc0 2a 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  * truncated. The
37cd0 20 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69 73   complex part is
37ce0 20 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65 65   that it may nee
37cf0 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65  d to be truncate
37d00 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a 65  d to.  ** a size
37d10 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e 20   that is not an 
37d20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
37d30 20 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65 20   of nToPageSize 
37d40 2d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  - the current.  
37d50 2a 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  ** page size use
37d60 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61  d by the pager a
37d70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 42  ssociated with B
37d80 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a 0a  -Tree pTo..  **.
37d90 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65    ** For example
37da0 2c 20 73 61 79 20 74 68 65 20 70 61 67 65 2d 73  , say the page-s
37db0 69 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32 30  ize of pTo is 20
37dc0 34 38 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  48 bytes and the
37dd0 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a 20   original .  ** 
37de0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
37df0 69 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c 65  is 5 (10 KB file
37e00 29 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73 20  ). If pFrom has 
37e10 61 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20 31  a page size of 1
37e20 30 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73 20  024 .  ** bytes 
37e30 61 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68 65  and 9 pages, the
37e40 6e 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64 73  n the file needs
37e50 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65 64   to be truncated
37e60 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20 20   to 9KB..  */.  
37e70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37e80 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46 72  K ){.    if( nFr
37e90 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f 50  omPageSize!=nToP
37ea0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
37eb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
37ec0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61  File = sqlite3Pa
37ed0 67 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e 70  gerFile(pBtTo->p
37ee0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 36  Pager);.      i6
37ef0 34 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29 6e  4 iSize = (i64)n
37f00 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20 28  FromPageSize * (
37f10 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a 20  i64)nFromPage;. 
37f20 20 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d 20       i64 iNow = 
37f30 28 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e 6e  (i64)((nToPage>n
37f40 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67 65  NewPage)?nToPage
37f50 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69 36  :nNewPage) * (i6
37f60 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a  4)nToPageSize; .
37f70 20 20 20 20 20 20 69 36 34 20 69 50 65 6e 64 69        i64 iPendi
37f80 6e 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44 49  ng = ((i64)PENDI
37f90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
37fa0 54 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54 6f  To)-1) *(i64)nTo
37fb0 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20 20  PageSize;.  .   
37fc0 20 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65     assert( iSize
37fd0 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20 20  <=iNow );.  .   
37fe0 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68 61     /* Commit pha
37ff0 73 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68 65  se one syncs the
38000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
38010 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
38020 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  o .      ** cont
38030 61 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67 69  aining the origi
38040 6e 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f 65  nal data. It doe
38050 73 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 64  s not sync the d
38060 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
38070 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41 66     ** itself. Af
38080 74 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20 69  ter doing this i
38090 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  t is safe to use
380a0 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61 6e   OsTruncate() an
380b0 64 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  d other.      **
380c0 20 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74 68   file APIs on th
380d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
380e0 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20  directly..      
380f0 2a 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e  */.      pBtTo->
38100 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20  db = pTo->db;.  
38110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38120 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
38130 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  One(pBtTo->pPage
38140 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20 20  r, 0, 0, 1);.   
38150 20 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e 6f     if( iSize<iNo
38160 77 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  w && rc==SQLITE_
38170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
38180 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
38190 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69 7a  cate(pFile, iSiz
381a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  e);.      }.  . 
381b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70       /* The loop
381c0 20 74 68 61 74 20 63 6f 70 69 65 64 20 64 61 74   that copied dat
381d0 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  a from database 
381e0 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69 64  pFrom to pTo did
381f0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70 6f   not.      ** po
38200 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b 69  pulate the locki
38210 6e 67 20 70 61 67 65 20 6f 66 20 64 61 74 61 62  ng page of datab
38220 61 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65 20  ase pTo. If the 
38230 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20 20  page-size of.   
38240 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20 73     ** pFrom is s
38250 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61 74  maller than that
38260 20 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d 65   of pTo, this me
38270 61 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77 69  ans some data wi
38280 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  ll.      ** not 
38290 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65 64  have been copied
382a0 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
382b0 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    ** This block 
382c0 63 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73 69  copies the missi
382d0 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74  ng data from dat
382e0 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70  abase pFrom to p
382f0 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73 69  To .      ** usi
38300 6e 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54 68  ng file APIs. Th
38310 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
38320 73 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  se at this point
38330 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20 20   we know that.  
38340 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74 68      ** all of th
38350 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  e original data 
38360 66 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65 65  from pTo has bee
38370 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  n synced into th
38380 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  e .      ** jour
38390 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68 69  nal file. At thi
383a0 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
383b0 20 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20 61   be safe to do a
383c0 6e 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20 20  nything at.     
383d0 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20 64   ** all to the d
383e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 65 78 63  atabase file exc
383f0 65 70 74 20 74 72 75 6e 63 61 74 65 20 69 74 20  ept truncate it 
38400 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a 20  to zero bytes.. 
38410 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
38420 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38430 26 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  && nFromPageSi