/ Hex Artifact Content
Login

Artifact 16dda042b6da72b2f93dd2694bd388d3ceb849ca:


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 30 20 32 30 30 38 2f 31  c,v 1.530 2008/1
0190: 31 2f 31 31 20 32 30 3a 35 31 3a 35 31 20 73 68  1/11 20:51:51 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 76 6f 69 64 20 64 65 66 72 61  tatic void defra
5250: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
5260: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
5270: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5280: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5290: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
52a0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
52b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
52c0: 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c  ss of a i-th cel
52d0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  l */.  int addr;
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
5300: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
5310: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
5320: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ay */.  int hdr;
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
5350: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
5360: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
5390: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
53a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
53b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
53c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
53d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
53e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
53f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
5400: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
5410: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
5420: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
5430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
5440: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
5450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
5460: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5480: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
5490: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
54a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
54b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
54c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
54d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
54e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
54f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
5500: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ll content */.. 
5510: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5520: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
5530: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
5540: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
5550: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
5560: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5570: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
5580: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
5590: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
55a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
55b0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
55c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
55d0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
55e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
55f0: 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50   temp = sqlite3P
5600: 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
5610: 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  age->pBt->pPager
5620: 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
5630: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
5640: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
5650: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
5660: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
5670: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
5680: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
5690: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
56a0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
56b0: 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c  r+3]) );.  usabl
56c0: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
56d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
56e0: 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74    cbrk = get2byt
56f0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5700: 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b  .  memcpy(&temp[
5710: 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72  cbrk], &data[cbr
5720: 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  k], usableSize -
5730: 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d   cbrk);.  cbrk =
5740: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66   usableSize;.  f
5750: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
5760: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
5770: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
5780: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
5790: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
57a0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
57b0: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
57c0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
57d0: 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dr);.    assert(
57e0: 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e   pc<pPage->pBt->
57f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
5800: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
5810: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
5820: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
5830: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d 65   -= size;.    me
5840: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
5850: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
5860: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
5870: 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20  (pAddr, cbrk);. 
5880: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
5890: 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  k>=cellOffset+2*
58a0: 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62  nCell );.  put2b
58b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
58c0: 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  , cbrk);.  data[
58d0: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
58e0: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
58f0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
5900: 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f  ;.  addr = cellO
5910: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20  ffset+2*nCell;. 
5920: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64   memset(&data[ad
5930: 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64  dr], 0, cbrk-add
5940: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
5950: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
5960: 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20  s of space on a 
5970: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  page..**.** Retu
5980: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
5990: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
59a0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
59b0: 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  te of.** the new
59c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
59d0: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
59e0: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
59f0: 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73 70 61 63  s enough.** spac
5a00: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
5a10: 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 61 69 6c   will never fail
5a20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
5a30: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
5a40: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
5a50: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
5a60: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
5a70: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
5a80: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
5a90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
5aa0: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
5ab0: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
5ac0: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
5ad0: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
5ae0: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
5af0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
5b00: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
5b10: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
5b20: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
5b30: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
5b40: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
5b50: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
5b60: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
5b70: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
5b80: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
5b90: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
5ba0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
5bb0: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
5bc0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
5bd0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
5be0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
5bf0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
5c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5c10: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
5c20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5c30: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
5c40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
5c50: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
5c60: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
5c70: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
5c80: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
5c90: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
5ca0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5cb0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
5cc0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
5cd0: 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d  = nByte;.  hdr =
5ce0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
5cf0: 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61  t;..  nFrag = da
5d00: 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28  ta[hdr+7];.  if(
5d10: 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20   nFrag<60 ){.   
5d20: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66   /* Search the f
5d30: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
5d40: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
5d50: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
5d60: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63   the.    ** spac
5d70: 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20  e request. */.  
5d80: 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a    addr = hdr+1;.
5d90: 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d      while( (pc =
5da0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5db0: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
5dc0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
5dd0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
5de0: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
5df0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
5e00: 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65    if( size<nByte
5e10: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +4 ){.          
5e20: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64  memcpy(&data[add
5e30: 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32  r], &data[pc], 2
5e40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  );.          dat
5e50: 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67  a[hdr+7] = nFrag
5e60: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5e70: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5e80: 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  n pc;.        }e
5e90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
5ea0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
5eb0: 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29  +2], size-nByte)
5ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5ed0: 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e  rn pc + size - n
5ee0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Byte;.        }.
5ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64        }.      ad
5f00: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20  dr = pc;.    }. 
5f10: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
5f20: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
5f30: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
5f40: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
5f50: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
5f60: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
5f70: 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74  t area..  */.  t
5f80: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
5f90: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e  ata[hdr+5]);.  n
5fa0: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
5fb0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
5fc0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
5fd0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
5fe0: 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30  .  if( nFrag>=60
5ff0: 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b   || cellOffset +
6000: 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d   2*nCell > top -
6010: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 64 65   nByte ){.    de
6020: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
6030: 67 65 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  ge);.    top = g
6040: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
6050: 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70  r+5]);.  }.  top
6060: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73   -= nByte;.  ass
6070: 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20  ert( cellOffset 
6080: 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70  + 2*nCell <= top
6090: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
60a0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
60b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b  );.  return top;
60c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
60d0: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
60e0: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
60f0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
6100: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
6110: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
6120: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
6130: 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a  ->aDisk[start].*
6140: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
6150: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22  f the block is "
6160: 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a  size" bytes..**.
6170: 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65  ** Most of the e
6180: 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e  ffort here is in
6190: 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73  volved in coales
61a0: 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  ing adjacent.** 
61b0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f  free blocks into
61c0: 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72   a single big fr
61d0: 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ee block..*/.sta
61e0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 53 70 61  tic void freeSpa
61f0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
6200: 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e  e, int start, in
6210: 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61  t size){.  int a
6220: 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72  ddr, pbegin, hdr
6230: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
6240: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
6250: 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72  >aData;..  asser
6260: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
6270: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
6280: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
6290: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
62a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
62b0: 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d  t( start>=pPage-
62c0: 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50  >hdrOffset+6+(pP
62d0: 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29  age->leaf?0:4) )
62e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61  ;.  assert( (sta
62f0: 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67  rt + size)<=pPag
6300: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6310: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
6320: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6330: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
6340: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
6350: 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20  t( size>=0 );   
6360: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
6370: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69  size is 4 */..#i
6380: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
6390: 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f  RE_DELETE.  /* O
63a0: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
63b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
63c0: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
63d0: 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a   SECURE_DELETE .
63e0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
63f0: 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
6400: 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73  e-time */.  mems
6410: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
6420: 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69   0, size);.#endi
6430: 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
6440: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
6450: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6460: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f  of freeblocks */
6470: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
6480: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
6490: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77  r = hdr + 1;.  w
64a0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
64b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
64c0: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
64d0: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
64e0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
64f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6500: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
6510: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
6520: 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20  ddr );.    addr 
6530: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20  = pbegin;.  }.  
6540: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d  assert( pbegin<=
6550: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
6560: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73  leSize-4 );.  as
6570: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
6580: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
6590: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
65a0: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
65b0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
65c0: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
65d0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
65e0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
65f0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
6600: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20  Free += size;.. 
6610: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
6620: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
6630: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50  s */.  addr = pP
6640: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
6650: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
6660: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
6670: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
6680: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
6690: 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73  , psize;.    ass
66a0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
66b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
66c0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
66d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
66e0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
66f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6700: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
6710: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
6720: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
6730: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
6740: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
6750: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
6760: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
6770: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
6780: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
6790: 20 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64   assert( frag<=d
67a0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
67b0: 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20  fset+7] );.     
67c0: 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
67d0: 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61  Offset+7] -= fra
67e0: 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  g;.      put2byt
67f0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
6800: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6810: 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20  pnext]));.      
6820: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6830: 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b  begin+2], pnext+
6840: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6850: 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29  next+2])-pbegin)
6860: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6870: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
6880: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
6890: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
68a0: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
68b0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
68c0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
68d0: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
68e0: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
68f0: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
6900: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
6910: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
6920: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
6930: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
6940: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
6950: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
6960: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
6970: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
6980: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
6990: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
69a0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b  ta[hdr+5], top +
69b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
69c0: 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d  pbegin+2]));.  }
69d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
69e0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
69f0: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
6a00: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
6a10: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
6a20: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
6a30: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
6a40: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
6a50: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
6a60: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
6a70: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
6a80: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
6a90: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
6aa0: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
6ab0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
6ac0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
6ad0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
6ae0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
6af0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
6b00: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
6b10: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
6b20: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
6b30: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
6b40: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
6b50: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
6b60: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
6b70: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
6b80: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
6b90: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
6ba0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
6bb0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
6bc0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
6bd0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6be0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
6bf0: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
6c00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6c10: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6c20: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6c30: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
6c40: 20 3d 20 66 6c 61 67 42 79 74 65 3e 3e 33 3b 20   = flagByte>>3; 
6c50: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
6c60: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
6c70: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
6c80: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
6c90: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
6ca0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
6cb0: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
6cc0: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
6cd0: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
6ce0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
6cf0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
6d00: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Key = 1;.    pPa
6d10: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50  ge->hasData = pP
6d20: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
6d30: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
6d40: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
6d50: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
6d60: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
6d70: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
6d80: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
6d90: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  ODATA ){.    pPa
6da0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
6db0: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
6dc0: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ta = 0;.    pPag
6dd0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
6de0: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
6df0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
6e00: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
6e10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6e20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6e30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
6e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6e50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
6e60: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
6e70: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
6e80: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
6e90: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
6ea0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
6eb0: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
6ec0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
6ed0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
6ee0: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
6ef0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
6f00: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
6f10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
6f20: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
6f30: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
6f40: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
6f50: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
6f60: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
6f70: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
6f80: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
6f90: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
6fa0: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
6fb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6fc0: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
6fd0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
6fe0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
6ff0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
7000: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7010: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7030: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
7040: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
7050: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
7060: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
7070: 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
7080: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
7090: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
70a0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
70b0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
70c0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
70d0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
70e0: 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20  Page) );..  if( 
70f0: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
7100: 7b 0a 20 20 20 20 69 6e 74 20 70 63 3b 20 20 20  {.    int pc;   
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
7120: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
7130: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
7140: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20  >aData[] */.    
7150: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
7160: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
7170: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
7180: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
7190: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
71a0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
71b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
71c0: 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
71d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
71e0: 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
71f0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ture */.    int 
7200: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
7210: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
7220: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
7230: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
7240: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
7250: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
7260: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
7270: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
7280: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46  er */.    int nF
7290: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
72a0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
72b0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
72c0: 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f  ge */.    int to
72d0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
72e0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
72f0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
7300: 72 65 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  rea */..    pBt 
7310: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
7320: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
7330: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
7340: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
7350: 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f  ta;.    if( deco
7360: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
7370: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
7380: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7390: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
73a0: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
73b0: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
73c0: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
73d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
73e0: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
73f0: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70  eSize - 1;.    p
7400: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
7410: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
7420: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
7430: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
7440: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
7450: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
7460: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
7470: 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20  leaf;.    top = 
7480: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7490: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67  dr+5]);.    pPag
74a0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
74b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
74c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
74d0: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
74e0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
74f0: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
7500: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
7510: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
7520: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
7530: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7540: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7550: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
7560: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
7570: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
7580: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
7590: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
75a0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
75b0: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
75c0: 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63  dr+7] + top - (c
75d0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
75e0: 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
75f0: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
7600: 20 20 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20        int next, 
7610: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
7620: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
7630: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
7640: 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20  ee block is off 
7650: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
7660: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7670: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
7680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
7690: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
76a0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
76b0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
76c0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
76d0: 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20       if( next>0 
76e0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
76f0: 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  +3 ){.        /*
7700: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
7710: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
7720: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
7730: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7740: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
7750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
7760: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20  ree += size;.   
7770: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
7780: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
7790: 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20  Free = nFree;.  
77a0: 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61    if( nFree>=usa
77b0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
77c0: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
77d0: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
77e0: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
77f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7800: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7810: 3b 20 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a  ; .    }..#if 0.
7820: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
7830: 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20  all the offsets 
7840: 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73  in the cell offs
7850: 65 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74  et array are wit
7860: 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a  hin range. .  **
7870: 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20   .  ** Omitting 
7880: 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79  this consistency
7890: 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67   check and using
78a0: 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b   the pPage->mask
78b0: 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74  Page mask.  ** t
78c0: 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75  o prevent overru
78d0: 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62  nning the page b
78e0: 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c  uffer in findCel
78f0: 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61  l() results in a
7900: 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f  .  ** 2.5% perfo
7910: 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a  rmance gain..  *
7920: 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f  /.  {.    u8 *pO
7930: 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ff;        /* It
7940: 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63  erator used to c
7950: 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66  heck all cell of
7960: 66 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e  fsets are in ran
7970: 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45  ge */.    u8 *pE
7980: 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  nd;        /* Po
7990: 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20  inter to end of 
79a0: 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61  cell offset arra
79b0: 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b  y */.    u8 mask
79c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
79d0: 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d  k of bits that m
79e0: 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d  ust be zero in M
79f0: 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  SB of cell offse
7a00: 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d  ts */.    mask =
7a10: 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61   ~(((u8)(pBt->pa
7a20: 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a  geSize>>8))-1);.
7a30: 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61      pEnd = &data
7a40: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50  [cellOffset + pP
7a50: 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  age->nCell*2];. 
7a60: 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74     for(pOff=&dat
7a70: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70  a[cellOffset]; p
7a80: 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28  Off!=pEnd && !((
7a90: 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f  *pOff)&mask); pO
7aa0: 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20  ff+=2);.    if( 
7ab0: 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20  pOff!=pEnd ){.  
7ac0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7ad0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7ae0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7af0: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
7b00: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
7b10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
7b30: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
7b40: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
7b50: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
7b60: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
7b70: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
7b80: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
7b90: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7ba0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
7bb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7bc0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7bd0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
7be0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
7bf0: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
7c00: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
7c10: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
7c20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7c30: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
7c40: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
7c50: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
7c60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7c70: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
7c80: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7c90: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
7ca0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7cb0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
7cc0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7cd0: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
7ce0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7cf0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7d00: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7d10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7d20: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
7d30: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65  mutex) );.  /*me
7d40: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
7d50: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
7d60: 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20  ize - hdr);*/.  
7d70: 64 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67  data[hdr] = flag
7d80: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
7d90: 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73   + 8 + 4*((flags
7da0: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a  &PTF_LEAF)==0);.
7db0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
7dc0: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
7dd0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
7de0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7df0: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
7e00: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
7e10: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
7e20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
7e30: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
7e40: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
7e50: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
7e60: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
7e70: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7e80: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
7e90: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
7ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
7eb0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
7ec0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
7ed0: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
7ee0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
7ef0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
7f00: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
7f10: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
7f20: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
7f30: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
7f40: 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
7f50: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
7f60: 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
7f70: 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
7f80: 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
7f90: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
7fa0: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
7fb0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
7fc0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
7fd0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
7fe0: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
7ff0: 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
8000: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
8010: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
8020: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
8030: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
8040: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  age);.  pPage->p
8050: 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
8060: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d  ;.  pPage->pBt =
8070: 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70   pBt;.  pPage->p
8080: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50  gno = pgno;.  pP
8090: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
80a0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
80b0: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
80c0: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
80d0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
80e0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
80f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
8100: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
8110: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
8120: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
8130: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
8140: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
8150: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
8160: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
8170: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
8180: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
8190: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
81a0: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
81b0: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
81c0: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
81d0: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
81e0: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
81f0: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
8200: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
8210: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
8220: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
8230: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
8240: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
8250: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
8260: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
8270: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
8280: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
8290: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
82a0: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
82b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
82c0: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
82d0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
82e0: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
82f0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
8300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8310: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
8320: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
8330: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
8340: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
8350: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
8360: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
8370: 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
8380: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61     /* Do not loa
8390: 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  d page content i
83a0: 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
83b0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
83c0: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
83d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
83e0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
83f0: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
8400: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
8410: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
8420: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
8430: 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65  pDbPage, noConte
8440: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
8450: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
8460: 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
8470: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
8480: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
8490: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
84a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
84b0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
84c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
84d0: 65 20 69 6e 20 70 61 67 65 73 2e 20 20 4f 72 20  e in pages.  Or 
84e0: 72 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  return -1 if.** 
84f0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
8500: 64 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  d of error..*/.s
8510: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
8520: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
8530: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
8540: 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
8550: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
8560: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
8570: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
8580: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
8590: 54 45 5f 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b  TE_OK?nPage:-1);
85a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
85b0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
85c0: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
85d0: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
85e0: 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20  tine.** is just 
85f0: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
8600: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
8610: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  arate calls to.*
8620: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  * sqlite3BtreeGe
8630: 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69  tPage() and sqli
8640: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
8650: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
8660: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
8670: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
8680: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
8690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
86a0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
86b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
86c0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
86d0: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
86e0: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20  Page **ppPage   
86f0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
8700: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
8710: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
8720: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8730: 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
8740: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
8750: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8760: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
8770: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
8780: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8790: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
87a0: 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PT; .  }..  /* I
87b0: 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63  t is often the c
87c0: 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ase that the pag
87d0: 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72  e we want is alr
87e0: 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20  eady in cache.. 
87f0: 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69   ** If so, get i
8800: 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  t directly.  Thi
8810: 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20  s saves us from 
8820: 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20  having to call. 
8830: 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75   ** pagerPagecou
8840: 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72  nt() to make sur
8850: 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e  e pgno is within
8860: 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72   limits, which r
8870: 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61  esults.  ** in a
8880: 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72   measureable per
8890: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
88a0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 44  ments..  */.  pD
88b0: 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
88c0: 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
88d0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
88e0: 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
88f0: 20 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61      /* Page is a
8900: 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 20  lready in cache 
8910: 2a 2f 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  */.    *ppPage =
8920: 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
8930: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
8940: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
8950: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
8960: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
8970: 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69     /* Page not i
8980: 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72  n cache.  Acquir
8990: 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
89a0: 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63   pgno>pagerPagec
89b0: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
89c0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
89d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
89e0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
89f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8a00: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
8a10: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  pgno, ppPage, 0)
8a20: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
8a30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
8a40: 61 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20  age = *ppPage;. 
8a50: 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
8a60: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72  >isInit ){.    r
8a70: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
8a80: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
8a90: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
8aa0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8ab0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
8ac0: 65 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  e);.    *ppPage 
8ad0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8ae0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8af0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
8b00: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
8b10: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
8b20: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
8b30: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
8b40: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
8b50: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
8b60: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
8b70: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
8b80: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
8b90: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
8ba0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8bb0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
8bc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8bd0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
8be0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
8bf0: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
8c00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
8c10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8c20: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
8c30: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
8c40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
8c50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8c60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8c70: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
8c80: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
8c90: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
8ca0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
8cb0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
8cc0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
8cd0: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
8ce0: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
8cf0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
8d00: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
8d10: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
8d20: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
8d30: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
8d40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
8d50: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
8d60: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
8d70: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
8d80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
8d90: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
8da0: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
8db0: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
8dc0: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
8dd0: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
8de0: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
8df0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8e00: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
8e10: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
8e20: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
8e30: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
8e40: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
8e50: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69  xtra(pData);.  i
8e60: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
8e70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8e80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8e90: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
8ea0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
8eb0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
8ec0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
8ed0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
8ee0: 28 70 44 61 74 61 29 3e 30 20 29 7b 0a 20 20 20  (pData)>0 ){.   
8ef0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
8f00: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
8f10: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8f20: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
8f30: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
8f40: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
8f50: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  c int sqlite3Btr
8f60: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
8f70: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ler(void *pArg, 
8f80: 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61 72  int n){.  BtShar
8f90: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
8fa0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
8fb0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
8fc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8fd0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8fe0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
8ff0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9000: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
9010: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
9020: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
9030: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
9040: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
9050: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
9060: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
9070: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
9080: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
9090: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
90a0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
90b0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
90c0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
90d0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
90e0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
90f0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
9100: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
9110: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
9120: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
9130: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
9140: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9150: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
9160: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
9170: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
9180: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
9190: 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
91a0: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
91b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
91c0: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
91d0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
91e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
91f0: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
9200: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
9210: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
9220: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
9230: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
9240: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
9250: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9260: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
9270: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
9280: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
92a0: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
92b0: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
92c0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
92d0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
92e0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
92f0: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  n() */.){.  sqli
9300: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
9310: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74      /* The VFS t
9320: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
9330: 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  tree */.  BtShar
9340: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
9350: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
9360: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
9370: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
9380: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
9390: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
93a0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
93b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
93c0: 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  int nReserve;.  
93d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
93e0: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20  bHeader[100];.. 
93f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
9400: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
9410: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
9420: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
9430: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
9440: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
9450: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
9460: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
9470: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
9480: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
9490: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
94a0: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
94b0: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
94c0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
94d0: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
94e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
94f0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
9500: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
9510: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9520: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
9530: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
9540: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
9550: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
9560: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
9570: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
9580: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
9590: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
95a0: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
95b0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
95c0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
95d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
95e0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
95f0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
9600: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
9610: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
9620: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
9630: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
9640: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9650: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9660: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
9670: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
9680: 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65  b = db;..#if !de
9690: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
96a0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
96b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
96c0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
96d0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
96e0: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
96f0: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
9700: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
9710: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
9720: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
9730: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
9740: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
9750: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
9760: 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c  =0.   && (db->fl
9770: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61  ags & SQLITE_Vta
9780: 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c  b)==0.   && zFil
9790: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
97a0: 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69  me[0].  ){.    i
97b0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
97c0: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
97d0: 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
97e0: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
97f0: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
9800: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
9810: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
9820: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
9830: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
9840: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
9850: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
9860: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e  hared;.      p->
9870: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
9880: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
9890: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
98a0: 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  che;.      if( !
98b0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
98c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
98d0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
98e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
98f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
9900: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75       sqlite3OsFu
9910: 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
9920: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
9930: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
9940: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
9950: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
9960: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
9970: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
9980: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
9990: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
99a0: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
99b0: 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  red);.      for(
99c0: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
99d0: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
99e0: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
99f0: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
9a00: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
9a10: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
9a20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
9a30: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
9a40: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
9a50: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
9a60: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
9a80: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
9a90: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
9aa0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  s ){.          p
9ab0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
9ac0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
9ad0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
9ae0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
9af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9b00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9b10: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
9b20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9b30: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
9b40: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
9b50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
9b60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
9b70: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
9b80: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
9b90: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
9ba0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
9bb0: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
9bc0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
9bd0: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
9be0: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
9bf0: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
9c00: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
9c10: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
9c20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9c30: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
9c40: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
9c50: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
9c60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9c70: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
9c80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9c90: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
9ca0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
9cb0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
9cc0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
9cd0: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
9ce0: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
9cf0: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
9d00: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
9d10: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
9d20: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
9d30: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
9d40: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
9d50: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
9d60: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
9d70: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
9d80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9d90: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
9da0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
9db0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9dc0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
9dd0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
9de0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9df0: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
9e00: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
9e10: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
9e20: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
9e30: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
9e40: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
9e50: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
9e60: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
9e70: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
9e80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9e90: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
9ea0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
9eb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
9ec0: 3e 62 75 73 79 48 64 72 2e 78 46 75 6e 63 20 3d  >busyHdr.xFunc =
9ed0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76   sqlite3BtreeInv
9ee0: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  okeBusyHandler;.
9ef0: 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64 72      pBt->busyHdr
9f00: 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a 20 20 20  .pArg = pBt;.   
9f10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
9f20: 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
9f30: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
9f40: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
9f70: 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  s, vfsFlags);.  
9f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9f90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
9fa0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
9fb0: 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
9fc0: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
9fd0: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
9fe0: 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
9ff0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a000: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
a010: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
a020: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a030: 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
a040: 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
a050: 72 2c 20 26 70 42 74 2d 3e 62 75 73 79 48 64 72  r, &pBt->busyHdr
a060: 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
a070: 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69  pBt;.  .    sqli
a080: 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
a090: 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ter(pBt->pPager,
a0a0: 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
a0b0: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
a0c0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
a0d0: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
a0e0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c  ->readOnly = sql
a0f0: 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
a100: 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
a110: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
a120: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
a130: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a  zDbHeader[16]);.
a140: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
a150: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
a160: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
a170: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
a180: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
a190: 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
a1a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
a1b0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
a1c0: 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  ageSize = 0;.   
a1d0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
a1e0: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
a1f0: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
a200: 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64 65 66  geSize);.#ifndef
a210: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a220: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
a230: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
a240: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
a250: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
a260: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
a270: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
a280: 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
a290: 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
a2a0: 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
a2b0: 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
a2c0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
a2d0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
a2e0: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
a2f0: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
a300: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
a310: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
a320: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
a330: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
a340: 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
a350: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
a360: 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
a370: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
a380: 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
a390: 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
a3a0: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
a3b0: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
a3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
a3d0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
a3e0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
a3f0: 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
a400: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
a410: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
a420: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
a430: 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
a440: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
a450: 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
a460: 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
a470: 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  e{.      nReserv
a480: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
a490: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
a4a0: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
a4b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a4c0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
a4d0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
a4e0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
a4f0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
a500: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
a510: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
a520: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
a530: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
a540: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
a550: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  if.    }.    pBt
a560: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
a570: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
a580: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
a590: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
a5a0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
a5b0: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
a5c0: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
a5d0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
a5e0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
a5f0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
a600: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a610: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a620: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
a630: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
a640: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a650: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
a660: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
a670: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
a680: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
a690: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
a6a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a6b0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
a6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a6d0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
a6e0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
a6f0: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
a700: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
a710: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
a720: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
a730: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
a740: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
a750: 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
a760: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
a770: 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
a780: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
a790: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a7a0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
a7b0: 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
a7c0: 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
a7e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
a7f0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
a800: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
a810: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
a820: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
a830: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
a850: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
a860: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
a870: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
a880: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
a890: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
a8a0: 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
a8b0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
a8c0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
a8d0: 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
a8e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a8f0: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
a900: 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
a910: 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
a920: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a930: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
a940: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a950: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
a960: 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
a970: 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
a980: 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
a990: 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
a9a0: 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
a9b0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
a9c0: 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
a9d0: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
a9e0: 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
a9f0: 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
aa00: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
aa10: 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
aa20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
aa30: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
aa40: 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
aa50: 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
aa60: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
aa70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
aa80: 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
aa90: 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
aaa0: 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
aab0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
aac0: 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
aad0: 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
aae0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
aaf0: 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
ab00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
ab10: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
ab20: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
ab30: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
ab40: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
ab50: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ab60: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
ab70: 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
ab80: 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
ab90: 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
aba0: 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
abb0: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
abc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
abd0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
abe0: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
abf0: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
ac00: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
ac10: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
ac20: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
ac30: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
ac40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ac50: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
ac60: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
ac70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ac80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ac90: 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
aca0: 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
acb0: 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
acc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
acd0: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
ace0: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
acf0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
ad00: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
ad10: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
ad20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
ad30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
ad40: 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
ad50: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ree = 0;.  }.  r
ad60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ad70: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
ad80: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
ad90: 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
ada0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
adb0: 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
adc0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
add0: 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
ade0: 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
adf0: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
ae00: 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
ae10: 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
ae20: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
ae30: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
ae40: 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
ae50: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
ae60: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
ae70: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
ae80: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
ae90: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
aea0: 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  HE.  sqlite3_mut
aeb0: 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42  ex *pMaster;.  B
aec0: 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
aed0: 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
aee0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
aef0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
af00: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
af10: 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73  );.  pMaster = s
af20: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
af30: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
af40: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
af50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
af60: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
af70: 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
af80: 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
af90: 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
afa0: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
afb0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
afc0: 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
afd0: 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
afe0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
aff0: 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
b000: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
b010: 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
b020: 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
b030: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
b040: 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
b050: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
b060: 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
b070: 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
b080: 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
b090: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
b0a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
b0b0: 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
b0c0: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
b0d0: 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
b0e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b0f0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
b100: 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
b110: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b120: 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
b130: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
b140: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
b150: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
b160: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
b170: 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
b180: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
b190: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b1a0: 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
b1b0: 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
b1c0: 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
b1d0: 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
b1e0: 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
b1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b200: 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
b210: 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
b220: 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
b230: 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
b240: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
b250: 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
b260: 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
b270: 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e );.  }.}../*.*
b280: 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
b290: 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
b2a0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
b2b0: 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
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 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
b2e0: 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
b2f0: 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
b300: 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
b310: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
b320: 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
b330: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
b340: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
b350: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
b360: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
b370: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
b380: 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
b390: 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
b3a0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
b3b0: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
b3c0: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
b3d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b3e0: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
b3f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
b400: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
b410: 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
b420: 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  >db;.  pCur = pB
b430: 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
b440: 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
b450: 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
b460: 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
b470: 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
b480: 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
b490: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
b4a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
b4b0: 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
b4c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b4d0: 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
b4e0: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
b4f0: 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
b500: 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
b510: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
b520: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b530: 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
b540: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
b550: 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
b560: 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
b570: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b580: 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ck(p);.  sqlite3
b590: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
b5a0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
b5b0: 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
b5c0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
b5d0: 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
b5e0: 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
b5f0: 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
b600: 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
b610: 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
b620: 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
b630: 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
b640: 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
b650: 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
b660: 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
b670: 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
b680: 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
b690: 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
b6a0: 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
b6b0: 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
b6c0: 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
b6d0: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
b6e0: 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
b6f0: 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
b700: 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
b710: 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
b720: 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
b730: 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
b740: 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
b750: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
b760: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
b770: 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
b780: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
b790: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
b7a0: 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
b7b0: 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
b7c0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
b7d0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
b7e0: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
b7f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b800: 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d  free(pBt->pSchem
b810: 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
b820: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
b830: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
b840: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
b850: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
b860: 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
b870: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
b880: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b890: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
b8a0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
b8b0: 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
b8c0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
b8d0: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
b8e0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b8f0: 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
b900: 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
b910: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
b920: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b930: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
b940: 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
b950: 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
b960: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
b970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
b980: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
b990: 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
b9a0: 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
b9b0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
b9c0: 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
b9d0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
b9e0: 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
b9f0: 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
ba00: 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
ba10: 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
ba20: 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
ba30: 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
ba40: 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
ba50: 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
ba60: 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
ba70: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
ba80: 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
ba90: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
baa0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
bab0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
bac0: 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
bad0: 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
bae0: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
baf0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
bb00: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
bb10: 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
bb20: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
bb30: 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
bb40: 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
bb50: 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
bb60: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
bb70: 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
bb80: 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
bb90: 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
bba0: 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
bbb0: 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
bbc0: 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
bbd0: 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
bbe0: 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
bbf0: 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
bc00: 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
bc10: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
bc20: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
bc30: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
bc40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
bc50: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
bc60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
bc70: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
bc80: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
bc90: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
bca0: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
bcb0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
bcc0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
bcd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
bce0: 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
bcf0: 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
bd00: 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
bd10: 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
bd20: 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
bd30: 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
bd40: 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
bd50: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
bd60: 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
bd70: 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
bd80: 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
bd90: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
bda0: 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
bdb0: 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
bdc0: 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
bdd0: 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
bde0: 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
bdf0: 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
be00: 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
be10: 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
be20: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
be30: 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
be40: 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
be50: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
be60: 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
be70: 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
be80: 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
be90: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
bea0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
beb0: 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
bec0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
bed0: 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
bee0: 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
bef0: 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
bf00: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
bf10: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
bf20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
bf30: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
bf40: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
bf50: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
bf60: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
bf70: 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
bf80: 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
bf90: 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69  ullSync);.  sqli
bfa0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
bfb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
bfc0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
bfd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
bfe0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
bff0: 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
c000: 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
c010: 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
c020: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
c030: 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
c040: 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
c050: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
c060: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
c070: 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
c080: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c090: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
c0a0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
c0b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c0c0: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
c0d0: 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74  );  .  sqlite3Bt
c0e0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
c0f0: 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
c100: 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
c110: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c120: 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
c130: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
c140: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
c150: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
c160: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c170: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
c180: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
c190: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
c1a0: 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
c1b0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
c1c0: 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
c1d0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
c1e0: 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
c1f0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
c200: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
c210: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
c220: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
c230: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
c240: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
c250: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
c260: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
c270: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
c280: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
c290: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
c2a0: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
c2b0: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
c2c0: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
c2d0: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
c2e0: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
c2f0: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
c300: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
c310: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
c320: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
c330: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
c340: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
c350: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
c360: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
c370: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
c380: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
c390: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
c3a0: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
c3b0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
c3c0: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
c3d0: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
c3e0: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
c3f0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
c400: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
c410: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
c420: 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
c430: 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
c440: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c450: 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
c460: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
c470: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c480: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
c490: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
c4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
c4b0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
c4c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
c4d0: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
c4e0: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
c4f0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
c500: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
c510: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
c520: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
c530: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
c540: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
c550: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
c560: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
c570: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
c580: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
c590: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
c5a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
c5b0: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
c5c0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
c5d0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c5e0: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
c5f0: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
c600: 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  pBt);.    rc = s
c610: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
c620: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
c630: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
c640: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  ze);.  }.  pBt->
c650: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
c660: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
c670: 73 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33  serve;.  sqlite3
c680: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c690: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c6a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c6b0: 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
c6c0: 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
c6d0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c6e0: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
c6f0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
c700: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
c710: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
c720: 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
c730: 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
c740: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c750: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
c760: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
c770: 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
c780: 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
c790: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c7a0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
c7b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
c7c0: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
c7d0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
c7e0: 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
c7f0: 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
c800: 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
c810: 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
c820: 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
c830: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
c840: 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
c850: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
c860: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
c870: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c880: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
c890: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
c8a0: 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
c8b0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c8c0: 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
c8d0: 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
c8e0: 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
c8f0: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
c900: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c910: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
c920: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
c930: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c940: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
c950: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
c960: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
c970: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
c980: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
c990: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
c9a0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
c9b0: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
c9c0: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
c9d0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
c9e0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
c9f0: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
ca00: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
ca10: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
ca20: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
ca30: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
ca40: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
ca50: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
ca60: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
ca70: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
ca80: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
ca90: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
caa0: 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
cab0: 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
cac0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
cad0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
cae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
caf0: 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
cb00: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
cb10: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
cb20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
cb30: 6e 74 20 61 76 20 3d 20 28 61 75 74 6f 56 61 63  nt av = (autoVac
cb40: 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20 73 71 6c  uum?1:0);..  sql
cb50: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
cb60: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
cb70: 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 61  geSizeFixed && a
cb80: 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  v!=pBt->autoVacu
cb90: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
cba0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
cbb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
cbc0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
cbd0: 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  v;.  }.  sqlite3
cbe0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
cbf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
cc00: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
cc10: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
cc20: 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
cc30: 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
cc40: 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
cc50: 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
cc60: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
cc70: 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
cc80: 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
cc90: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
cca0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
ccb0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ccc0: 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
ccd0: 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
cce0: 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
ccf0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
cd00: 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
cd10: 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
cd20: 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
cd30: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
cd40: 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
cd50: 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
cd60: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
cd70: 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
cd80: 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
cd90: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
cda0: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
cdb0: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
cdc0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
cdd0: 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
cde0: 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
cdf0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
ce00: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
ce10: 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
ce20: 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
ce30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
ce40: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
ce50: 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
ce60: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
ce70: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
ce80: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
ce90: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
cea0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
ceb0: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
cec0: 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
ced0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
cee0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
cef0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
cf00: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
cf10: 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
cf20: 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
cf30: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
cf40: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
cf50: 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
cf60: 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72   nPage;..  asser
cf70: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
cf80: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
cf90: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
cfa0: 70 50 61 67 65 31 20 29 20 72 65 74 75 72 6e 20  pPage1 ) return 
cfb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20  SQLITE_OK;.  rc 
cfc0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
cfd0: 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
cfe0: 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
cff0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d000: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
d010: 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
d020: 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
d030: 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
d040: 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
d050: 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
d060: 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
d070: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
d080: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
d090: 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
d0a0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
d0b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
d0c0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d0d0: 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ailed;.  }else i
d0e0: 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
d0f0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a    int pageSize;.
d100: 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
d110: 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
d120: 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
d130: 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
d140: 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
d150: 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
d160: 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
d170: 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
d180: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d190: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d1a0: 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
d1b0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72   ){.      pBt->r
d1c0: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadOnly = 1;.   
d1d0: 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
d1e0: 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
d1f0: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
d200: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
d210: 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
d220: 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
d230: 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
d240: 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
d250: 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
d260: 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
d270: 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
d280: 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
d290: 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
d2a0: 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
d2b0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
d2c0: 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
d2d0: 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
d2e0: 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
d2f0: 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
d300: 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
d310: 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
d320: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
d330: 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
d340: 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
d350: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
d360: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
d370: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
d380: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
d390: 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b  yte(&page1[16]);
d3a0: 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
d3b0: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
d3c0: 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c  !=0 || pageSize<
d3d0: 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  512 ||.        (
d3e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
d3f0: 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61  SIZE<32768 && pa
d400: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
d410: 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20  X_PAGE_SIZE).   
d420: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
d430: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d450: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
d460: 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
d470: 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
d480: 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
d490: 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
d4a0: 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
d4b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
d4c0: 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
d4d0: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
d4e0: 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
d4f0: 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
d500: 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
d510: 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
d520: 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
d530: 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
d540: 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
d550: 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
d560: 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
d570: 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
d580: 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
d590: 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
d5a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
d5b0: 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
d5c0: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
d5d0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
d5e0: 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
d5f0: 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
d600: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
d610: 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
d620: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
d630: 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
d640: 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
d650: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
d660: 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
d670: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
d680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
d690: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
d6a0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
d6b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
d6c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d6d0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
d6e0: 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30  ( usableSize<500
d6f0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
d700: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
d720: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
d730: 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
d740: 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
d750: 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
d760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d770: 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
d780: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
d790: 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
d7a0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
d7b0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
d7c0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
d7d0: 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
d7e0: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
d7f0: 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
d800: 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
d810: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
d820: 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
d830: 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
d840: 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
d850: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
d860: 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
d870: 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
d880: 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
d890: 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
d8a0: 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
d8b0: 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
d8c0: 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
d8d0: 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
d8e0: 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
d8f0: 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
d900: 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
d910: 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
d920: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
d930: 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
d940: 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
d950: 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
d960: 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
d970: 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
d980: 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
d990: 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
d9a0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
d9b0: 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20  -byte poiner, a 
d9c0: 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
d9d0: 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
d9e0: 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
d9f0: 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
da00: 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
da10: 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
da20: 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
da30: 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
da40: 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
da50: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
da60: 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
da70: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  23;.  pBt->minLo
da80: 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
da90: 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
daa0: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
dab0: 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
dac0: 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
dad0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
dae0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
daf0: 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
db00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
db10: 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
db20: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
db30: 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
db40: 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
db50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
db60: 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
db70: 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
db80: 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
db90: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
dba0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dbb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
dbc0: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f  ne works like lo
dbd0: 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74  ckBtree() except
dbe0: 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e   that it also in
dbf0: 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73  vokes the.** bus
dc00: 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
dc10: 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74  ere is lock cont
dc20: 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ention..*/.stati
dc30: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57  c int lockBtreeW
dc40: 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a  ithRetry(Btree *
dc50: 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pRef){.  int rc 
dc60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
dc70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
dc80: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
dc90: 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52  Ref) );.  if( pR
dca0: 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  ef->inTrans==TRA
dcb0: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75  NS_NONE ){.    u
dcc0: 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  8 inTransaction 
dcd0: 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54  = pRef->pBt->inT
dce0: 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
dcf0: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
dd00: 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Ref);.    rc = s
dd10: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
dd20: 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a  Trans(pRef, 0);.
dd30: 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69      pRef->pBt->i
dd40: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69  nTransaction = i
dd50: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
dd60: 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20    pRef->inTrans 
dd70: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
dd80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65  _OK ){.      pRe
dda0: 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  f->pBt->nTransac
ddb0: 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  tion--;.    }.  
ddc0: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
ddd0: 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (pRef);.  }.  re
dde0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20  turn rc;.}.     
ddf0: 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65    ../*.** If the
de00: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
de10: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
de20: 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
de30: 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
de40: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
de50: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
de60: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
de70: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
de80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
de90: 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
dea0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
deb0: 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
dec0: 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
ded0: 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
dee0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
def0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
df00: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
df10: 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72   cursors, this r
df20: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
df30: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  p..**.** If ther
df40: 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
df50: 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
df60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
df70: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
df80: 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
df90: 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
dfa0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
dfb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
dfc0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
dfd0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
dfe0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
dff0: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
e000: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20  pBt->pCursor==0 
e010: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
e020: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
e030: 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
e040: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d  t(pBt->pPager)>=
e050: 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  1 ){.      asser
e060: 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
e070: 61 44 61 74 61 20 29 3b 0a 23 69 66 20 30 0a 20  aData );.#if 0. 
e080: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50       if( pBt->pP
e090: 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29  age1->aData==0 )
e0a0: 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
e0b0: 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74 2d 3e  e *pPage = pBt->
e0c0: 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20  pPage1;.        
e0d0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
e0e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
e0f0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
e100: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e);.        pPag
e110: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
e120: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
e130: 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23  o = 1;.      }.#
e140: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 6c 65  endif.      rele
e150: 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
e160: 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
e170: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
e180: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
e190: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
e1a0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
e1b0: 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
e1c0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
e1d0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
e1e0: 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
e1f0: 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
e200: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
e210: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
e220: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
e230: 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
e240: 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
e250: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e260: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
e270: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
e280: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e290: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
e2a0: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
e2b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e2c0: 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  _OK || nPage>0 )
e2d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e2e0: 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
e2f0: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
e300: 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
e310: 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
e320: 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
e330: 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
e340: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
e350: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
e360: 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
e370: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
e380: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
e390: 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
e3a0: 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
e3b0: 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
e3c0: 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
e3d0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
e3e0: 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
e3f0: 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
e400: 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42  .  data[20] = pB
e410: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
e420: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
e430: 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
e440: 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
e450: 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
e460: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
e470: 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
e480: 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
e490: 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
e4a0: 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
e4b0: 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  TA );.  pBt->pag
e4c0: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
e4d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e4e0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e4f0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
e500: 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
e510: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
e520: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e530: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
e540: 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
e550: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
e560: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
e570: 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
e580: 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
e590: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
e5a0: 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
e5b0: 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
e5c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e5d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
e5e0: 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
e5f0: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
e600: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e610: 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
e620: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
e630: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
e640: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
e650: 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
e660: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
e670: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
e680: 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
e690: 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
e6a0: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
e6b0: 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
e6c0: 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
e6d0: 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
e6e0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
e6f0: 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
e700: 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
e710: 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
e720: 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
e730: 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
e740: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
e750: 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
e760: 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
e770: 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
e780: 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
e790: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
e7a0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e7b0: 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
e7c0: 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
e7d0: 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
e7e0: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
e7f0: 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
e800: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
e810: 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
e820: 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
e830: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
e840: 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
e850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e860: 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
e870: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e880: 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
e890: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
e8a0: 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
e8b0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e8c0: 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
e8d0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e8e0: 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
e8f0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e900: 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
e910: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e920: 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
e930: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
e940: 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
e950: 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
e960: 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
e970: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
e980: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
e990: 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
e9a0: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
e9b0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
e9c0: 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
e9d0: 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
e9e0: 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
e9f0: 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
ea00: 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
ea10: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
ea20: 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
ea30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
ea40: 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
ea50: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
ea60: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
ea70: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
ea80: 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
ea90: 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
eaa0: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
eab0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
eac0: 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
ead0: 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
eae0: 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
eaf0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
eb00: 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
eb10: 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
eb20: 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
eb30: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
eb40: 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
eb50: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
eb60: 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
eb70: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
eb80: 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
eb90: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
eba0: 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
ebb0: 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
ebc0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
ebd0: 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
ebe0: 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
ebf0: 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
ec00: 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
ec10: 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
ec20: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
ec30: 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
ec40: 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
ec50: 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
ec60: 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
ec70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
ec80: 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
ec90: 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
eca0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
ecb0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
ecc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
ecd0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ece0: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
ecf0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72  b = p->db;.  btr
ed00: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
ed10: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
ed20: 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
ed30: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
ed40: 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
ed50: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
ed60: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
ed70: 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
ed80: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
ed90: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
eda0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
edb0: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
edc0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
edd0: 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
ede0: 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
edf0: 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
ee00: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
ee10: 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
ee20: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
ee30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
ee40: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
ee50: 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
ee60: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
ee70: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
ee80: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
ee90: 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
eea0: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
eeb0: 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
eec0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
eed0: 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
eee0: 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
eef0: 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
ef00: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
ef10: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
ef20: 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
ef30: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
ef40: 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
ef50: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
ef60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
ef70: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
ef80: 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77  TRANS_WRITE && w
ef90: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
efa0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
efb0: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
efc0: 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
efd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
efe0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
eff0: 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
f000: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
f010: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
f020: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
f030: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
f040: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
f050: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
f060: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f070: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
f080: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
f090: 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a  _begun;.      }.
f0a0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
f0b0: 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
f0c0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
f0d0: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
f0e0: 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74       rc = lockBt
f0f0: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ree(pBt);.      
f100: 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61  }while( pBt->pPa
f110: 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ge1==0 && rc==SQ
f120: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
f130: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
f140: 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
f150: 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
f160: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
f170: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f180: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
f190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f1a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f1b0: 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
f1c0: 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20  Page1->pDbPage, 
f1d0: 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20  wrflag>1);.     
f1e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f1f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f200: 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
f210: 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
f220: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f230: 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  .  .    if( rc==
f240: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f250: 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 20     if( wrflag ) 
f260: 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
f270: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f280: 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
f290: 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
f2a0: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
f2b0: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
f2c0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f2d0: 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
f2e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f2f0: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
f300: 79 48 61 6e 64 6c 65 72 28 70 42 74 2c 20 30 29  yHandler(pBt, 0)
f310: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
f320: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f330: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
f340: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
f350: 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
f360: 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ction++;.    }. 
f370: 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
f380: 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
f390: 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
f3a0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
f3b0: 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
f3c0: 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
f3d0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
f3e0: 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
f3f0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
f400: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
f410: 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20  D_CACHE.    if( 
f420: 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
f430: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
f440: 70 45 78 63 6c 75 73 69 76 65 20 29 3b 0a 20 20  pExclusive );.  
f450: 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73      pBt->pExclus
f460: 69 76 65 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23  ive = p;.    }.#
f470: 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e  endif.  }...tran
f480: 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74 72 65 65  s_begun:.  btree
f490: 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
f4a0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
f4b0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
f4c0: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
f4d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f4e0: 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
f4f0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
f500: 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
f510: 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
f520: 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
f530: 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
f540: 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
f550: 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
f560: 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
f570: 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
f580: 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
f590: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
f5a0: 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
f5b0: 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
f5c0: 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
f5d0: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
f600: 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
f610: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f640: 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
f650: 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
f660: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f680: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f690: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
f6a0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
f6b0: 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
f6c0: 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
f6d0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
f6e0: 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
f6f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f700: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
f710: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
f720: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
f730: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
f740: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
f750: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
f760: 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
f770: 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
f780: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
f790: 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
f7a0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
f7b0: 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
f7c0: 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
f7d0: 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  , i);..    rc = 
f7e0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
f7f0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
f800: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f810: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
f820: 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
f830: 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
f840: 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
f850: 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
f860: 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
f870: 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
f880: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
f890: 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
f8a0: 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
f8b0: 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  REE, pgno);.    
f8c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f8d0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63  _OK ) goto set_c
f8e0: 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
f8f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
f900: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
f910: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
f920: 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
f930: 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
f940: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
f950: 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  8]);.    rc = pt
f960: 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
f970: 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
f980: 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  TREE, pgno);.  }
f990: 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
f9a0: 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
f9b0: 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
f9c0: 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
f9d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
f9e0: 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c  ewhere on pPage,
f9f0: 20 77 68 69 63 68 20 69 73 20 67 75 61 72 65 6e   which is guaren
fa00: 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72  teed to be a btr
fa10: 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20  ee page, not an 
fa20: 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
fa30: 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  , is a pointer t
fa40: 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f  o page iFrom. Mo
fa50: 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
fa60: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
fa70: 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50  nts to.** iTo. P
fa80: 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
fa90: 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
faa0: 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20  e of pointer to 
fab0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
fac0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  .** follows:.**.
fad0: 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
fae0: 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
faf0: 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
fb00: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
fb10: 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
fb40: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
fb50: 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
fb60: 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
fb70: 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
fb80: 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
fb90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fba0: 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
fbb0: 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
fbc0: 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
fbd0: 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
fbe0: 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
fbf0: 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
fc00: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
fc10: 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
fc20: 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
fc30: 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
fc40: 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
fc50: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
fc60: 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
fc70: 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
fc80: 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
fc90: 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
fca0: 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
fcb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
fcc0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
fcd0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65  utex) );.  if( e
fce0: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
fcf0: 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
fd00: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
fd10: 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
fd20: 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
fd30: 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
fd40: 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
fd50: 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
fd60: 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
fd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fd80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fd90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
fda0: 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
fdb0: 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
fdc0: 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74  {.    int isInit
fdd0: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
fde0: 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
fdf0: 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
fe00: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
fe10: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
fe20: 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
fe30: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
fe40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
fe50: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
fe60: 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
fe70: 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
fe80: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
fe90: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
fea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
feb0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
fec0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
fed0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
fee0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
fef0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
ff00: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
ff10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
ff20: 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
ff30: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
ff40: 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  low]) ){.       
ff50: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
ff60: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
ff70: 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
ff80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ff90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ffa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
ffb0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
ffc0: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
ffd0: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
ffe0: 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
fff0: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
10000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10010 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10020 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
10030 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
10040 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
10050 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
10060 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
10070 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
10080 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
10090 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
100a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
100b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
100c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
100d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
100e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
100f0 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
10100 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
10110 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
10120 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
10130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10140 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
10150 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
10160 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
10170 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
10180 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
10190 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
101a0 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
101b0 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74  ins valid..*/.st
101c0 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
101d0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
101e0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
101f0 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
10200 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
10210 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
10220 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
10230 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
10240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10250 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
10260 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
10270 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
10280 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
10290 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
102a0 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
102b0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
102c0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
102d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
102e0 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
102f0 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
10300 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a  .  int isCommit.
10310 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10320 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
10330 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
10340 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
10350 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
10360 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
10370 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
10380 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
10390 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
103a0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
103b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
103c0 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
103d0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
103e0 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
103f0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
10400 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
10410 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
10420 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10430 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10440 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
10450 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
10460 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
10470 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
10480 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
10490 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
104a0 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
104b0 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
104c0 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
104d0 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
104e0 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
104f0 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
10500 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
10510 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
10520 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
10530 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10540 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
10550 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
10560 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
10570 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
10580 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10590 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
105a0 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
105b0 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
105c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
105d0 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
105e0 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
105f0 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
10600 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
10610 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
10620 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
10630 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
10640 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
10650 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
10660 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
10670 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
10680 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
10690 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
106a0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
106b0 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
106c0 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
106d0 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
106e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
106f0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
10700 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
10710 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
10720 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
10730 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
10740 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
10750 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
10760 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
10770 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
10780 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
10790 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
107a0 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
107b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
107c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
107d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
107e0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
107f0 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
10800 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
10810 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
10820 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
10830 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
10840 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
10850 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
10860 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
10870 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
10880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10890 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
108a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
108b0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
108c0 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
108d0 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
108e0 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
108f0 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
10900 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
10910 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
10920 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
10930 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
10940 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
10950 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
10960 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
10970 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
10980 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
10990 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
109a0 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
109b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
109c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
109d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
109e0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
109f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
10a00 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
10a10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10a30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
10a40 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
10a50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
10a60 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
10a70 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
10a80 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
10a90 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
10aa0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
10ab0 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
10ac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10ad0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
10ae0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
10af0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
10b00 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
10b10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10b20 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
10b30 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
10b40 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
10b50 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
10b60 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
10b70 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
10b80 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
10b90 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
10ba0 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
10bb0 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
10bc0 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
10bd0 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
10be0 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
10bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
10c00 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
10c10 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
10c20 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
10c30 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
10c40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
10c50 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
10c60 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
10c70 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
10c80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
10c90 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
10ca0 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
10cb0 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
10cc0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
10cd0 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
10ce0 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
10cf0 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
10d00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
10d10 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
10d20 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
10d30 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
10d40 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
10d50 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
10d60 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
10d70 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
10d80 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
10d90 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
10da0 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
10db0 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
10dc0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
10dd0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
10de0 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
10df0 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
10e00 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
10e10 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
10e20 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
10e30 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
10e40 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50   Pgno nFin){.  P
10e50 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20  gno iLastPg;    
10e60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
10e70 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
10e80 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
10e90 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
10ea0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10eb0 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
10ec0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
10ed0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
10ee0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10ef0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10f00 20 69 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e   iLastPg = pBt->
10f10 6e 54 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c  nTrunc;.  if( iL
10f20 61 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  astPg==0 ){.    
10f30 69 4c 61 73 74 50 67 20 3d 20 70 61 67 65 72 50  iLastPg = pagerP
10f40 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
10f50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
10f60 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
10f70 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
10f80 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
10f90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
10fa0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ) ){.    int rc;
10fb0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
10fc0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
10fd0 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
10fe0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
10ff0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11000 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
11010 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46  reeList==0 || nF
11020 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20  in==iLastPg ){. 
11030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11040 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
11050 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
11060 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
11070 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
11080 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
11090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
110a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
110b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
110c0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
110d0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
110e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
110f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
11100 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
11110 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
11120 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e  {.      if( nFin
11130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
11140 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
11150 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
11160 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
11170 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
11180 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e  .        ** if n
11190 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Fin is non-zero.
111a0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
111b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
111c0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
111d0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
111e0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
111f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
11200 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
11210 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
11220 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
11230 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
11240 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
11250 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
11260 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
11270 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
11280 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
11290 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
112a0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
112b0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
112c0 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20  astPg, 1);.     
112d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
112e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
112f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
11310 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
11320 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
11330 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
11340 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
11350 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
11360 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
11370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11380 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
11390 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
113a0 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
113b0 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
113c0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
113d0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
113e0 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
113f0 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
11400 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11420 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11430 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
11440 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74   nFin is zero, t
11450 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
11460 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
11470 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
11480 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
11490 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
114a0 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
114b0 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
114c0 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
114d0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
114e0 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20  r hand, if nFin 
114f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
11500 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
11510 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
11520 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
11530 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
11540 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
11550 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
11560 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
11570 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
11580 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
11590 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
115a0 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
115b0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
115c0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
115d0 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30  , &iFreePg, 0, 0
115e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
115f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11600 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
11610 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
11620 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11630 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
11640 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
11650 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
11660 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21     }while( nFin!
11670 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  =0 && iFreePg>nF
11680 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
11690 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
116a0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
116b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
116c0 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74  PagerWrite(pLast
116d0 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
116e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
116f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11700 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
11710 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
11720 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
11730 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21  , iFreePg, nFin!
11740 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
11750 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
11760 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
11770 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11780 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
11790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
117a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d     }.  }..  pBt-
117b0 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50  >nTrunc = iLastP
117c0 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  g - 1;.  while( 
117d0 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e  pBt->nTrunc==PEN
117e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
117f0 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41  Bt)||PTRMAP_ISPA
11800 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72  GE(pBt, pBt->nTr
11810 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d  unc) ){.    pBt-
11820 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20  >nTrunc--;.  }. 
11830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11840 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
11850 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
11860 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
11870 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
11880 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
11890 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
118a0 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
118b0 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
118c0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
118d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
118e0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
118f0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
11900 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
11910 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
11920 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
11930 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
11940 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
11950 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65   no error occure
11960 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
11970 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
11980 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
11990 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
119a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
119b0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
119c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
119d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
119e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
119f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11a00 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
11a10 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
11a20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
11a30 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
11a40 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
11a50 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
11a60 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
11a70 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
11a80 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
11a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61   }else{.    inva
11aa0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
11ab0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
11ac0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
11ad0 53 74 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20  Step(pBt, 0);.  
11ae0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
11af0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11b00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11b10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11b20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
11b30 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
11b40 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
11b50 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
11b60 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  ited for an auto
11b70 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
11b80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
11b90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11ba0 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
11bb0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
11bc0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
11bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11be0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
11bf0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
11c00 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
11c10 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
11c20 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
11c30 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
11c40 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
11c50 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
11c60 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
11c70 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
11c80 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
11c90 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
11ca0 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63  t, Pgno *pnTrunc
11cb0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11cc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
11cd0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
11ce0 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
11cf0 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
11d00 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
11d10 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  unt(pPager) );..
11d20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11d30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11d40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
11d50 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
11d60 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
11d70 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
11d80 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
11d90 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
11da0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
11db0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  n = 0;..    if( 
11dc0 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29  pBt->nTrunc==0 )
11dd0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72  {.      Pgno nFr
11de0 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e  ee;.      Pgno n
11df0 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f  Ptrmap;.      co
11e00 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  nst int pgsz = p
11e10 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  Bt->pageSize;.  
11e20 20 20 20 20 69 6e 74 20 6e 4f 72 69 67 20 3d 20      int nOrig = 
11e30 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
11e40 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20  Bt->pPager);..  
11e50 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
11e60 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
11e70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
11e80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11e90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
11ea0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
11eb0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
11ec0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
11ed0 20 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20      nOrig--;.   
11ee0 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
11ef0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
11f00 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11f10 33 36 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72  36]);.      nPtr
11f20 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
11f30 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
11f40 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
11f50 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
11f60 20 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69       nFin = nOri
11f70 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
11f80 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  map;.      if( n
11f90 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
11fa0 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
11fb0 46 69 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin<=PENDING_BYT
11fc0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
11fd0 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20         nFin--;. 
11fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
11ff0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
12000 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
12010 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
12020 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
12030 20 20 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a          nFin--;.
12040 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
12050 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
12060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12070 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
12080 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b  Step(pBt, nFin);
12090 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
120a0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
120b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
120c0 46 69 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e  Fin==0 || pBt->n
120d0 54 72 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e  Trunc==0 || nFin
120e0 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a  <=pBt->nTrunc);.
120f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12100 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
12110 70 42 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e  pBt->nTrunc && n
12120 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Fin ){.        r
12130 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12140 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
12150 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
12160 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
12170 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
12180 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
12190 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
121a0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
121b0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  36], 0);.       
121c0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e   pBt->nTrunc = n
121d0 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
121e0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
121f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12200 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
12210 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
12220 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
12230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12240 7b 0a 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d  {.    *pnTrunc =
12250 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20   pBt->nTrunc;.  
12260 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
12270 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
12280 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
12290 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
122a0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
122b0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
122c0 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
122d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
122e0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
122f0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
12300 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
12310 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
12320 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
12330 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
12340 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
12350 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
12360 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
12370 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
12380 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
12390 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
123a0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
123b0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
123c0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
123d0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
123e0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
123f0 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
12400 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
12410 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
12420 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12430 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
12440 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
12450 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
12460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12470 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
12480 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
12490 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
124a0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
124b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
124c0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
124d0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
124e0 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
124f0 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
12500 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
12510 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
12520 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
12530 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
12540 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
12550 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
12560 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
12570 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
12580 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72  treeCommit() for
12590 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
125a0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
125b0 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
125c0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
125d0 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
125e0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
125f0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
12600 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
12610 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
12620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12630 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
12640 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
12650 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
12660 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
12670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
12680 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
12690 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
126a0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
126b0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
126c0 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
126d0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
126e0 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
126f0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
12700 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
12710 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
12720 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
12730 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
12740 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
12750 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
12760 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
12770 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
12780 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
12790 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
127a0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
127b0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
127c0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
127d0 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
127e0 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
127f0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
12800 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
12810 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
12820 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
12830 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12840 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
12850 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
12860 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
12870 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12880 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
12890 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
128a0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
128b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
128c0 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d     Pgno nTrunc =
128d0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
128e0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
128f0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
12900 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
12910 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12920 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
12930 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
12940 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
12950 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e  umCommit(pBt, &n
12960 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69  Trunc); .      i
12970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12980 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12990 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
129a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
129b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
129c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
129d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
129e0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
129f0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
12a00 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b 0a  er, nTrunc, 0);.
12a10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12a20 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
12a30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12a40 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
12a50 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
12a60 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
12a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12a80 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
12a90 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
12aa0 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
12ab0 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
12ac0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
12ad0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
12ae0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
12af0 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  d should be invo
12b00 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ked.** prior to 
12b10 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
12b20 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
12b30 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
12b40 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c  utine did.** all
12b50 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
12b60 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
12b70 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
12b80 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
12b90 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
12ba0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
12bb0 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
12bc0 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
12bd0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
12be0 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
12bf0 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
12c00 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12c10 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61  nal.** (which ca
12c20 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
12c30 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
12c40 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  and drop locks..
12c50 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
12c60 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
12c70 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
12c80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
12c90 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
12ca0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
12cb0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
12cc0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
12cd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12ce0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
12cf0 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
12d00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12d10 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
12d20 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12d30 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
12d40 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
12d50 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
12d60 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
12d70 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
12d80 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
12d90 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
12da0 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
12db0 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
12dc0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
12dd0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
12de0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
12df0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
12e00 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
12e10 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12e20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
12e30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
12e40 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12e50 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
12e60 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12e70 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
12e80 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
12e90 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
12ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12eb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
12ec0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
12ed0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12ee0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
12ef0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
12f00 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  EAD;.    pBt->in
12f10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
12f20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
12f30 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
12f40 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
12f50 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
12f60 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
12f70 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
12f80 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
12f90 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
12fa0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
12fb0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
12fc0 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
12fd0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
12fe0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
12ff0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
13000 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
13010 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
13020 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
13030 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13040 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
13050 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ONE ){.    pBt->
13060 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
13070 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
13080 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
13090 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
130a0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
130b0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
130c0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68  ..  /* Set the h
130d0 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74  andles current t
130e0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
130f0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
13100 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
13110 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
13120 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
13130 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
13140 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
13150 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61  .  */.  p->inTra
13160 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
13170 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
13180 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
13190 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
131a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
131b0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
131c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
131d0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
131e0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
131f0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
13200 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
13210 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
13220 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
13230 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
13240 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13250 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
13260 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
13270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13280 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13290 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
132a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
132b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
132c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
132d0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
132e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
132f0 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
13300 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
13310 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
13320 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
13330 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
13340 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
13350 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
13360 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
13370 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
13380 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
13390 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
133a0 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73  ne, a write-curs
133b0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
133c0 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
133d0 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74  ble of writing t
133e0 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20  o the databse.  
133f0 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  That means the c
13400 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69  ursor was.** ori
13410 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ginally opened f
13420 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74  or writing and t
13430 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  he cursor has no
13440 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a  t be disabled.**
13450 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73   by having its s
13460 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20  tate changed to 
13470 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f  CURSOR_FAULT..*/
13480 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
13490 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74  tWriteCursors(Bt
134a0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
134b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
134c0 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
134d0 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
134e0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
134f0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
13500 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46     if( pCur->wrF
13510 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74  lag && pCur->eSt
13520 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
13530 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
13540 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
13550 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
13560 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
13570 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
13580 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
13590 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
135a0 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
135b0 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
135c0 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
135d0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
135e0 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
135f0 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
13600 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
13610 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
13620 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
13630 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
13640 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
13650 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
13660 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
13670 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13680 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
13690 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
136a0 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
136b0 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
136c0 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
136d0 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
136e0 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
136f0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
13700 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
13710 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
13720 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
13730 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
13740 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
13750 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
13760 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
13770 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
13780 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
13790 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
137a0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
137b0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
137c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
137d0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
137e0 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
137f0 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
13800 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
13810 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13820 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
13830 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
13840 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
13850 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 73  p->pNext){.    s
13860 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
13870 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70  Cursor(p);.    p
13880 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
13890 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
138a0 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a  skip = errCode;.
138b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
138c0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
138d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
138e0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
138f0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
13900 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
13910 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
13920 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
13930 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
13940 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
13950 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
13960 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
13970 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
13980 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
13990 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
139a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
139b0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
139c0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
139d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
139e0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
139f0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
13a00 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
13a10 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
13a20 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
13a30 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
13a40 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13a50 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13a60 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13a70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
13a80 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
13a90 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
13aa0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
13ab0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
13ac0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23  rs(pBt, 0, 0);.#
13ad0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ae0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13af0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13b00 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
13b10 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65  is is a horrible
13b20 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49   situation. An I
13b30 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
13b40 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
13b50 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67  st.    ** trying
13b60 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20   to save cursor 
13b70 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68  positions. If th
13b80 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  is is an automat
13b90 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a  ic rollback (as.
13ba0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c      ** the resul
13bb0 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e  t of a constrain
13bc0 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  t, malloc() fail
13bd0 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  ure or IO error)
13be0 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   then .    ** th
13bf0 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69  e cache may be i
13c00 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73  nternally incons
13c10 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74  istent (not cont
13c20 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29  ain valid trees)
13c30 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61   so.    ** we ca
13c40 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75  nnot simply retu
13c50 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20  rn the error to 
13c60 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74  the caller. Inst
13c70 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20  ead, abort .    
13c80 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74  ** all queries t
13c90 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67  hat may be using
13ca0 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73   any of the curs
13cb0 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20  ors that failed 
13cc0 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a  to save..    */.
13cd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13ce0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
13cf0 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  , rc);.  }.#endi
13d00 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  f.  btreeIntegri
13d10 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41  ty(p);.  unlockA
13d20 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
13d30 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
13d40 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
13d50 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66     int rc2;..#if
13d60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
13d80 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
13d90 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
13da0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
13db0 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
13dc0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
13dd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
13de0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
13df0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
13e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13e10 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
13e20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
13e30 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
13e40 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
13e50 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
13e60 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
13e70 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
13e80 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
13e90 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
13ea0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
13eb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
13ec0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
13ed0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
13ee0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
13ef0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13f00 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
13f10 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13f20 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13f30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
13f40 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
13f50 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
13f60 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13f70 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
13f80 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e    }..  if( p->in
13f90 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
13fa0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
13fb0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
13fc0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  on>0 );.    pBt-
13fd0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
13fe0 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
13ff0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
14000 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
14010 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
14020 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
14030 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  }..  p->inTrans 
14040 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14050 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
14060 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
14070 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
14080 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14090 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
140a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
140b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
140c0 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
140d0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
140e0 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e 73  n.  The subtrans
140f0 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61  action can.** ca
14100 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
14110 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
14120 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
14130 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d  action..** You m
14140 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
14150 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73  saction before s
14160 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
14170 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
14180 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
14190 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
141a0 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61  ically if the ma
141b0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  in transaction.*
141c0 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  * commits or rol
141d0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  ls back..**.** O
141e0 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73  nly one subtrans
141f0 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
14200 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20  tive at a time. 
14210 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
14220 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61  to try.** to sta
14230 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e  rt a new subtran
14240 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68  saction if anoth
14250 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  er subtransactio
14260 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
14270 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ive..**.** State
14280 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
14290 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
142a0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
142b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
142c0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
142d0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
142e0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
142f0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
14300 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
14310 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
14320 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
14330 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
14340 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
14350 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
14360 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
14370 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
14380 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
14390 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
143a0 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
143b0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
143c0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
143d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
143e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
143f0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
14400 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
14410 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ( (p->inTrans!=T
14420 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
14430 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  Bt->inStmt ){.  
14440 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
14450 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
14460 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
14470 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
14480 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14490 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
144a0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
144b0 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
144c0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f  dOnly ? SQLITE_O
144d0 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72  K : sqlite3Pager
144e0 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70  StmtBegin(pBt->p
144f0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
14500 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
14510 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14520 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14530 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
14540 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d  Commit the statm
14550 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
14560 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
14570 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f  progress.  If no
14580 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69  .** subtransacti
14590 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68  on is active, th
145a0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
145b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
145c0 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72  eeCommitStmt(Btr
145d0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
145e0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
145f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
14600 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14610 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
14620 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74  p->db;.  if( pBt
14630 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74  ->inStmt && !pBt
14640 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
14650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14660 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42  gerStmtCommit(pB
14670 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  t->pPager);.  }e
14680 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
14690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
146a0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
146b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
146c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
146d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
146e0 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  llback the activ
146f0 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  e statement subt
14700 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
14710 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  no subtransactio
14720 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74  n.** is active t
14730 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14740 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c   no-op..**.** Al
14750 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
14760 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  e invalidated by
14770 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
14780 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a    Any attempt.**
14790 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
147a0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
147b0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
147c0 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
147d0 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74  n.** will result
147e0 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f   in an error..*/
147f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14800 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74  eRollbackStmt(Bt
14810 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
14820 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14830 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14840 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
14850 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14860 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
14870 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
14880 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
14890 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
148a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
148b0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74  StmtRollback(pBt
148c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
148d0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
148e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
148f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14900 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14910 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
14920 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
14930 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
14940 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
14950 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
14960 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
14970 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
14980 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
14990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
149a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
149b0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
149c0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
149d0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
149e0 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
149f0 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
14a00 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
14a10 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
14a20 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
14a30 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
14a40 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
14a50 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
14a60 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
14a70 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
14a80 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
14a90 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
14aa0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
14ab0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
14ac0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
14ad0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
14ae0 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
14af0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
14b00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14b10 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
14b20 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
14b30 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
14b40 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
14b50 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
14b60 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
14b70 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
14b80 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
14b90 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
14ba0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
14bb0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
14bc0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
14bd0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
14be0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
14bf0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
14c00 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
14c10 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
14c20 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14c30 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
14c40 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
14c50 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
14c60 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
14c70 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
14c80 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
14c90 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
14ca0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
14cb0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
14cc0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
14cd0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
14ce0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
14cf0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
14d00 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
14d10 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
14d20 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
14d30 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
14d40 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
14d50 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
14d60 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
14d70 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65  ursorSize() byte
14d80 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  s of memory .** 
14d90 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43  pointed to by pC
14da0 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72  ur have been zer
14db0 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  oed by the calle
14dc0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
14dd0 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
14de0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
14e10 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
14e20 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
14e50 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
14e60 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
14e90 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
14ea0 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
14eb0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
14ec0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
14ed0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
14ee0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
14ef0 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
14f00 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
14f30 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
14f40 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
14f50 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14f60 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
14f70 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
14f80 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28  utex(p) );.  if(
14f90 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69   wrFlag ){.    i
14fa0 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
14fb0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14fc0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
14fd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14fe0 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
14ff0 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 20  , iTable, 0, 0) 
15000 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15010 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
15020 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
15030 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
15040 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42  {.    rc = lockB
15050 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
15060 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15090 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72  }.    if( pBt->r
150a0 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61  eadOnly && wrFla
150b0 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  g ){.      retur
150c0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
150d0 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  Y;.    }.  }.  p
150e0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
150f0 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
15100 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
15110 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
15120 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20  pBt->pPager)==0 
15130 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
15140 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f  TE_EMPTY;.    go
15150 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72  to create_cursor
15160 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a  _exception;.  }.
15170 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
15180 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
15190 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
151a0 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20  ->apPage[0]);.  
151b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
151c0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72  K ){.    goto cr
151d0 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
151e0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
151f0 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
15200 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
15210 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
15220 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
15230 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
15240 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  es, link the cur
15250 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
15260 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73  hared list and s
15270 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20  et *ppCur (the. 
15280 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d   ** output argum
15290 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
152a0 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43  tion)..  */.  pC
152b0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
152c0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
152d0 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
152e0 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
152f0 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
15300 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d   wrFlag;.  pCur-
15310 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
15320 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
15330 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
15340 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
15350 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
15360 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
15370 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
15380 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
15390 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75 72 6e  VALID;..  return
153a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65   SQLITE_OK;..cre
153b0 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
153c0 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50  tion:.  releaseP
153d0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
153e0 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  [0]);.  unlockBt
153f0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
15400 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15410 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15420 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
15430 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
15460 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
15470 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15490 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
154a0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
154b0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
154c0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
154f0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
15500 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
15510 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
15540 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
15550 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
15580 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
15590 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
155a0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
155b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
155c0 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64  ->pBt->db = p->d
155d0 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  b;.  rc = btreeC
155e0 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
155f0 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
15600 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
15610 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15620 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15630 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15640 65 43 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20  eCursorSize(){. 
15650 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42   return sizeof(B
15660 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f  tCursor);.}..../
15670 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
15680 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
15690 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
156a0 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
156b0 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
156c0 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
156d0 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
156e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
156f0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
15700 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
15710 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
15720 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
15730 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
15740 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
15750 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
15760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
15770 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
15780 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  .    pBt->db = p
15790 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 73  Btree->db;.    s
157a0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
157b0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
157c0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
157d0 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
157e0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
157f0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
15800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
15810 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
15820 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
15830 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
15840 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
15850 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
15860 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
15870 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
15880 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
15890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
158a0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
158b0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
158c0 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
158d0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
158e0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
158f0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
15900 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
15910 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
15920 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15930 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
15940 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15950 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15960 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72   Make a temporar
15970 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c  y cursor by fill
15980 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64  ing in the field
15990 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a  s of pTempCur..*
159a0 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * The temporary 
159b0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e  cursor is not on
159c0 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74   the cursor list
159d0 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a   for the Btree..
159e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
159f0 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f  treeGetTempCurso
15a00 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
15a10 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
15a20 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
15a30 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
15a40 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
15a50 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65   );.  memcpy(pTe
15a60 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a  mpCur, pCur, siz
15a70 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
15a80 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78    pTempCur->pNex
15a90 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75  t = 0;.  pTempCu
15aa0 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
15ab0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d  for(i=0; i<=pTem
15ac0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
15ad0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
15ae0 67 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d  gerRef(pTempCur-
15af0 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50  >apPage[i]->pDbP
15b00 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
15b10 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70  ** Delete a temp
15b20 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63  orary cursor suc
15b30 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79  h as was made by
15b40 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f   the CreateTempo
15b50 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20  raryCursor().** 
15b60 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a  function above..
15b70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
15b80 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
15b90 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
15ba0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
15bb0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
15bc0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
15bd0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
15be0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
15bf0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
15c00 50 61 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d  PagerUnref(pCur-
15c10 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50  >apPage[i]->pDbP
15c20 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
15c30 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
15c40 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
15c50 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
15c60 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
15c70 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
15c80 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
15c90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
15ca0 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71  alid, call.** sq
15cb0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15cc0 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
15cd0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
15ce0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
15cf0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
15d00 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
15d10 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
15d20 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
15d30 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
15d40 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73  er of calls to s
15d50 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
15d60 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
15d70 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
15d80 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
15d90 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
15da0 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
15db0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
15dc0 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
15dd0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
15de0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
15df0 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
15e00 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
15e10 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
15e20 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
15e30 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
15e40 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
15e50 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
15e60 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
15e70 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
15e80 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
15e90 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
15ea0 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
15eb0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
15ec0 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
15ed0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
15ee0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
15ef0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
15f00 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
15f10 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
15f20 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
15f30 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
15f40 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
15f50 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
15f60 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
15f70 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
15f80 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
15f90 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
15fa0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15fb0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
15fc0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
15fd0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
15fe0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
15ff0 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
16000 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
16010 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
16020 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
16030 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
16040 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
16050 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
16060 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
16070 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
16080 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
16090 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
160a0 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
160b0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
160c0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
160d0 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
160e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
160f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
16100 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
16110 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
16120 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
16130 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
16140 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
16150 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
16160 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
16170 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
16180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
16190 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
161a0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
161b0 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
161c0 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
161d0 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
161e0 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
161f0 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
16200 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
16210 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
16220 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
16270 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
16280 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
162c0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
162d0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
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 5c 0a 20 20 20 20 73 71 6c         \.    sql
16310 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
16320 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
16330 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
16340 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
16350 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43  >info); \.    pC
16360 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
16370 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 7d 65 6c           \.  }el
163b0 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
16400 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
16410 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
16420 20 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 5c 0a 20 20 7d             \.  }
16450 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
16460 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  VER */../*.** Se
16470 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
16480 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
16490 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
164a0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
164b0 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
164c0 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
164d0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
164e0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
164f0 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
16500 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
16510 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
16520 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
16530 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
16540 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
16550 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
16560 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
16570 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
16580 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
16590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
165a0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
165b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
165c0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
165d0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
165e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
165f0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
16600 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
16610 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
16620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16630 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16640 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
16650 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
16660 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
16670 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
16680 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
16690 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
166a0 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69  ID ){.      *pSi
166b0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
166c0 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
166d0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
166e0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
166f0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
16700 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
16710 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
16720 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
16730 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16740 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
16750 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
16760 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
16770 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65  s to.  Always re
16780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
16790 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
167a0 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20  t possible.  If 
167b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
167c0 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
167d0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e  ointing to an en
167e0 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68  try (which can h
167f0 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
16800 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61  le, if.** the da
16810 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29  tabase is empty)
16820 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20   then *pSize is 
16830 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74  set to 0..*/.int
16840 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
16850 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
16860 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
16870 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
16880 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
16890 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
168a0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
168b0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
168c0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
168d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
168e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
168f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
16900 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
16910 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
16920 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
16930 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
16940 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
16950 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
16960 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
16970 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
16980 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
16990 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
169a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
169b0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
169c0 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
169d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
169e0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
169f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16a00 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
16a10 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
16a20 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
16a30 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
16a40 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
16a50 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
16a60 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
16a70 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
16a80 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
16a90 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
16aa0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
16ab0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
16ac0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
16ad0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
16ae0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
16af0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
16b00 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
16b10 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
16b20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16b30 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
16b40 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
16b50 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
16b60 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rwise:.**.** Unl
16b70 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73  ess pPgnoNext is
16b80 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20   NULL, the page 
16b90 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
16ba0 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  xt overflow .** 
16bb0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
16bc0 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74  ed list is writt
16bd0 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
16be0 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a  . If page ovfl.*
16bf0 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  * is the last pa
16c00 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
16c10 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
16c20 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
16c30 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
16c40 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
16c50 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
16c60 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68  o the MemPage* h
16c70 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67  andle.** for pag
16c80 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65  e ovfl. The unde
16c90 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61 67  rlying pager pag
16ca0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
16cb0 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74  requested.** wit
16cc0 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  h the noContent 
16cd0 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65  flag set, so the
16ce0 20 70 61 67 65 20 64 61 74 61 20 61 63 63 65 73   page data acces
16cf0 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69  sable via.** thi
16d00 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74  s handle may not
16d10 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a   be trusted..*/.
16d20 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
16d30 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
16d40 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
16d50 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d70 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
16d80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
16d90 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
16da0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
16db0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
16dc0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
16dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16de0 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
16df0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
16e00 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
16e10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
16e20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16e30 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
16e40 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e  utex) );.  /* On
16e50 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20  e of these must 
16e60 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68  not be NULL. Oth
16e70 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c  erwise, why call
16e80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20   this function? 
16e90 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61  */.  assert(ppPa
16ea0 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29  ge || pPgnoNext)
16eb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f  ;..  /* If pPgno
16ec0 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
16ed0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
16ee0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
16ef0 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20   to obtain.  ** 
16f00 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72  a MemPage* refer
16f10 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61  ence only. No pa
16f20 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69  ge-data is requi
16f30 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  red in this case
16f40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
16f50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72  gnoNext ){.    r
16f60 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
16f70 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
16f80 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  vfl, ppPage, 1);
16f90 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16fa0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16fb0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
16fc0 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
16fd0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
16fe0 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
16ff0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
17000 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
17010 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
17020 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
17030 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
17040 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
17050 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
17060 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
17070 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
17080 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
17090 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
170a0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
170b0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
170c0 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
170d0 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
170e0 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
170f0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
17100 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
17110 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
17120 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
17130 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
17140 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
17150 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
17160 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
17170 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17180 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
17190 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
171a0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
171b0 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
171c0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
171d0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
171e0 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
171f0 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
17200 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
17210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17220 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17240 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17250 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
17260 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
17270 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
17280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17290 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
172a0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50  ( next==0 || ppP
172b0 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  age ){.    MemPa
172c0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
172d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
172e0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
172f0 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
17300 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73  next!=0);.    as
17310 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
17320 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b  OK || pPage==0);
17330 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  .    if( next==0
17340 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
17350 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
17360 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
17370 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
17380 0a 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20  .    if( ppPage 
17390 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
173a0 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65   = pPage;.    }e
173b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  lse{.      relea
173c0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
173d0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e     }.  }.  *pPgn
173e0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20  oNext = next;.. 
173f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17400 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
17410 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
17420 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
17430 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
17440 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
17450 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
17460 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
17470 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
17480 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
17490 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
174a0 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
174b0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
174c0 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
174d0 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
174e0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
174f0 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
17500 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
17510 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
17520 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
17530 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
17540 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
17550 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
17560 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
17570 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
17580 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
17590 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
175a0 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
175b0 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
175c0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
175d0 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
175e0 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
175f0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
17600 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
17610 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
17620 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
17630 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
17640 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
17650 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
17660 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17670 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
17680 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
17690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
176a0 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
176b0 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
176c0 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
176d0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
176e0 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
176f0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
17700 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
17710 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
17720 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
17730 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
17740 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
17750 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
17760 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17770 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
17780 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
177a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
177b0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
177c0 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
177d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
177e0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
177f0 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
17800 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
17810 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
17820 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
17830 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
17840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17860 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
17870 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
17880 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
17890 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
178a0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
178b0 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
178c0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
178d0 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
178e0 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
178f0 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
17900 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
17910 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
17920 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
17930 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
17940 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
17950 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
17960 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
17970 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
17980 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
17990 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
179a0 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
179b0 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
179c0 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
179d0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
179e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
179f0 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64  oes not make a d
17a00 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65  istinction betwe
17a10 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e  en key and data.
17a20 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64  .** It just read
17a30 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65  s or writes byte
17a40 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f  s from the paylo
17a50 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d  ad area.  Data m
17a60 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20  ight .** appear 
17a70 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
17a80 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
17a90 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
17aa0 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
17ab0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
17ac0 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
17ad0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
17ae0 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
17af0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
17b00 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
17b10 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
17b20 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
17b30 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
17b40 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
17b50 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
17b60 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
17b70 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
17b80 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
17b90 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
17ba0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
17bb0 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
17bc0 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
17bd0 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
17be0 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
17bf0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
17c00 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
17c10 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
17c20 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
17c30 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
17c40 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
17c50 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
17c60 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
17c70 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
17c80 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
17c90 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
17ca0 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
17cb0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
17cc0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
17cd0 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
17ce0 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
17cf0 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
17d00 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
17d10 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
17d20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
17d30 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
17d40 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
17d50 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
17d60 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
17d70 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
17d80 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
17d90 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
17da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17db0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
17dc0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
17dd0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
17de0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
17df0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
17e00 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20  /.  int offset, 
17e10 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
17e20 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
17e30 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
17e40 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
17e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
17e60 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
17e70 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
17e80 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
17e90 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
17ea0 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
17eb0 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65  */ .  int skipKe
17ec0 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  y,         /* of
17ed0 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64  fset begins at d
17ee0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
17ef0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  rue */.  int eOp
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f10 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
17f20 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
17f30 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
17f40 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
17f50 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
17f60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
17f70 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
17f80 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
17f90 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
17fa0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
17fb0 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
17fc0 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
17fd0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
17fe0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
18010 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
18020 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
18030 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
18040 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18050 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
18070 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
18080 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
18090 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  l );.  assert( o
180a0 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73  ffset>=0 );.  as
180b0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
180c0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
180d0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
180e0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
180f0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
18100 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f  ell + pCur->info
18110 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79  .nHeader;.  nKey
18120 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65   = (pPage->intKe
18130 79 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e  y ? 0 : pCur->in
18140 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28  fo.nKey);..  if(
18150 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
18160 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a  offset += nKey;.
18170 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74    }.  if( offset
18180 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
18190 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a  ->info.nData ){.
181a0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
181b0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
181c0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
181d0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
181e0 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
181f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18200 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
18210 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
18220 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
18230 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
18240 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
18250 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
18260 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
18270 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
18280 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
18290 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
182a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
182b0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
182c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
182d0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
182e0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
182f0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
18300 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
18310 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
18320 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
18330 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
18340 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
18350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
18360 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
18370 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
18380 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
18390 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
183a0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
183b0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f  .    const int o
183c0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
183d0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
183e0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
183f0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
18400 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
18410 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
18420 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
18430 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
18440 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
18450 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18460 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
18470 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
18480 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
18490 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
184a0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
184b0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
184c0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
184d0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
184e0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
184f0 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
18500 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
18510 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
18520 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
18530 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
18540 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
18550 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
18560 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
18570 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
18580 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
18590 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
185a0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
185b0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
185c0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
185d0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
185e0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
185f0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
18600 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
18610 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
18620 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
18630 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
18640 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
18650 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
18660 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
18670 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
18680 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
18690 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
186a0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
186b0 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
186c0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66  nOvfl);.      if
186d0 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72  ( nOvfl && !pCur
186e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
186f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18700 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18710 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
18720 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
18730 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
18740 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
18750 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
18760 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
18770 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
18780 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
18790 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
187a0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
187b0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
187c0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
187d0 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
187e0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
187f0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
18800 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
18810 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
18820 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
18830 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
18840 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
18850 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
18860 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
18870 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
18880 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
18890 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
188a0 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
188b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
188c0 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
188d0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
188e0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
188f0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
18900 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
18910 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18920 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
18930 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
18940 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
18950 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
18960 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
18970 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
18980 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
18990 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
189a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
189b0 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
189c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
189d0 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
189e0 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
189f0 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
18a00 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
18a10 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
18a20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
18a30 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
18a40 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
18a50 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
18a60 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
18a70 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
18a80 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
18a90 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
18aa0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
18ab0 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
18ac0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
18ad0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
18ae0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
18af0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
18b00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18b10 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18b20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
18b30 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
18b40 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
18b50 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
18b60 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
18b70 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
18b80 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
18b90 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
18ba0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
18bb0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
18bc0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
18bd0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
18be0 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
18bf0 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
18c00 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
18c10 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
18c20 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
18c30 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
18c40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18c50 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
18c60 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
18c70 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
18c80 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
18c90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18ca0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
18cb0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
18cc0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
18cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18ce0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
18cf0 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
18d00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
18d10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
18d30 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
18d40 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
18d50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
18d60 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
18d70 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
18d80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
18d90 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
18da0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
18db0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
18dc0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
18dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18de0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
18df0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
18e00 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
18e10 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
18e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
18e30 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
18e40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
18e50 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
18e60 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
18e70 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
18e80 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
18e90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
18ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18eb0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
18ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18ed0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
18f00 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
18f10 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
18f20 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
18f30 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
18f40 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
18f50 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
18f60 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
18f70 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
18f80 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
18f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18fa0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
18fb0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
18fc0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
18fd0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
18fe0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
18ff0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
19000 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
19010 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
19020 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
19030 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
19040 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
19050 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
19060 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
19070 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
19080 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19090 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
190a0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
190b0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
190c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
190d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
190e0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
190f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19100 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19110 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
19120 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
19130 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
19140 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50 61    if( pCur->apPa
19150 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
19160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19170 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19180 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
19190 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
191a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
191b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
191c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
191d0 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
191e0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
191f0 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
19200 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
19210 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
19220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19230 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
19240 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
19250 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
19260 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
19270 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
19280 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
19290 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
192a0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
192b0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
192c0 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
192d0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
192e0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
192f0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
19300 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
19310 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
19320 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
19330 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
19340 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
19350 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
19360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19370 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
19380 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
19390 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
193a0 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
193b0 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
193c0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
193d0 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
193e0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
193f0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
19400 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
19410 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19420 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19430 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19440 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
19450 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
19460 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
19470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19480 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
19490 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
194a0 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
194b0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
194c0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
194d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
194e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
194f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
19500 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
19510 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
19520 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
19530 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
19540 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
19550 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29  amt, pBuf, 1, 0)
19560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19570 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
19580 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
19590 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
195a0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
195b0 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
195c0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
195d0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
195e0 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
195f0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
19600 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b  ** the key if sk
19610 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20  ipKey==0 and it 
19620 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65  points to the be
19630 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
19640 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31  if.** skipKey==1
19650 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
19660 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
19670 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20  ble key/data is 
19680 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
19690 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
196a0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
196b0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  lue returned wil
196c0 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61  l not be.** a va
196d0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
196e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
196f0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
19700 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
19710 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
19720 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
19730 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
19740 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
19750 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
19760 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
19770 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
19780 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
19790 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
197a0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
197b0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
197c0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
197d0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
197e0 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
197f0 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
19800 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
19810 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
19820 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
19830 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68  reassembly.** th
19840 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
19850 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
19860 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
19870 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
19880 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
19890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
198a0 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
198b0 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
198c0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
198d0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
198e0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
198f0 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
19900 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
19910 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19920 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
19930 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19940 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
19950 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
19960 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
19970 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
19980 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
19990 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20  */.  int *pAmt, 
199a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
199b0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
199c0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
199d0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
199e0 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
199f0 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
19a00 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
19a10 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
19a20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
19a30 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
19a40 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
19a50 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e  32 nKey;.  int n
19a60 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
19a70 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
19a80 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
19a90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
19aa0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
19ab0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19ac0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
19ae0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19af0 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ur) );.  pPage =
19b00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
19b10 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
19b20 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
19b30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
19b40 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
19b50 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
19b60 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
19b70 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
19b80 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
19b90 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
19ba0 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
19bb0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
19bc0 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
19bd0 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43  e{.    nKey = pC
19be0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
19bf0 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
19c00 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
19c10 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
19c20 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
19c30 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
19c40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
19c50 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
19c60 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66  o.nLocal;.    if
19c70 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b  ( nLocal>nKey ){
19c80 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  .      nLocal = 
19c90 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nKey;.    }.  }.
19ca0 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
19cb0 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
19cc0 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
19cd0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
19ce0 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
19cf0 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
19d00 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
19d10 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
19d20 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
19d30 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
19d40 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
19d50 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
19d60 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
19d70 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
19d80 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
19d90 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
19da0 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
19db0 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
19dc0 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
19dd0 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
19de0 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
19df0 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
19e00 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
19e10 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
19e20 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
19e30 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
19e40 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
19e50 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
19e60 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
19e70 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
19e80 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
19e90 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
19ea0 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
19eb0 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
19ec0 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
19ed0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
19ee0 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
19ef0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
19f00 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
19f10 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
19f20 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
19f30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
19f40 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
19f50 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19f60 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
19f70 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
19f80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
19f90 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
19fa0 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
19fb0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
19fc0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
19fd0 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn 0;.}.const vo
19fe0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
19ff0 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
1a000 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1a010 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
1a020 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1a030 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
1a040 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a050 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
1a060 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
1a070 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
1a080 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31  ad(pCur, pAmt, 1
1a090 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a0a0 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  0;.}.../*.** Mov
1a0b0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1a0c0 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
1a0d0 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
1a0e0 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
1a0f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
1a100 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
1a110 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
1a120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1a130 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
1a140 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
1a150 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  ewPgno){.  int r
1a160 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75  c;.  int i = pCu
1a170 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50  r->iPage;.  MemP
1a180 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20  age *pNewPage;. 
1a190 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a1a0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
1a1b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1a1c0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1a1d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1a1e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1a1f0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1a200 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
1a210 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
1a220 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  H );.  if( pCur-
1a230 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
1a240 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
1a250 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1a260 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1a270 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
1a280 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
1a290 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
1a2a0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
1a2b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
1a2c0 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
1a2d0 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
1a2e0 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
1a2f0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
1a300 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
1a310 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1a320 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1a330 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
1a340 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a  age->nCell<1 ){.
1a350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a360 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1a370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1a380 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1a390 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
1a3a0 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
1a3b0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
1a3c0 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
1a3d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1a3e0 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
1a3f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
1a400 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
1a410 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
1a420 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
1a430 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
1a440 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
1a450 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
1a460 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
1a470 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
1a480 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
1a490 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
1a4a0 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
1a4b0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
1a4c0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
1a4d0 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
1a4e0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
1a4f0 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
1a500 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ld){.  assert( i
1a510 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
1a520 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
1a530 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
1a540 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
1a550 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
1a560 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
1a570 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
1a580 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
1a590 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
1a5a0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1a5b0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
1a5c0 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
1a5d0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
1a5e0 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
1a5f0 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
1a600 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
1a610 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
1a620 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
1a630 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
1a640 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
1a650 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
1a660 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
1a670 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
1a680 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
1a690 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
1a6a0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
1a6b0 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
1a6c0 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
1a6d0 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
1a6e0 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
1a6f0 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
1a700 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
1a710 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1a720 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
1a730 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1a740 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a750 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a760 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a770 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a780 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1a790 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1a7a0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
1a7b0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1a7c0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
1a7d0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
1a7e0 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
1a7f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1a800 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
1a810 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1a820 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
1a830 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1a840 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
1a850 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1a860 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1a870 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
1a880 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
1a890 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1a8a0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
1a8b0 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  NKey = 0;.}../*.
1a8c0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a8d0 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  or to the root p
1a8e0 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  age.*/.static in
1a8f0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
1a900 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1a910 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
1a920 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a930 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70  E_OK;.  Btree *p
1a940 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1a950 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a960 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
1a970 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a980 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a990 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1a9a0 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
1a9b0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1a9c0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1a9d0 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
1a9e0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1a9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
1aa00 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
1aa10 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1aa20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1aa30 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
1aa40 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
1aa50 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1aa60 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
1aa70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1aa80 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20  pCur->skip;.    
1aa90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1aaa0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1aab0 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
1aac0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
1aad0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1aae0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75   for(i=1; i<=pCu
1aaf0 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
1ab00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ab10 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
1ab20 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
1ab30 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20  e{.    if( .    
1ab40 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
1ab50 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1ab60 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
1ab70 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
1ab80 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20 29 7b  Page[0])).    ){
1ab90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
1aba0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1abb0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
1abc0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1abd0 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ..  pRoot = pCur
1abe0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
1abf0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
1ac00 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
1ac10 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ot );.  pCur->iP
1ac20 61 67 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  age = 0;.  pCur-
1ac30 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
1ac40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1ac50 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
1ac60 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
1ac70 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1ac80 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
1ac90 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
1aca0 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
1acb0 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
1acc0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1acd0 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20  >pgno==1 );.    
1ace0 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
1acf0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
1ad00 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
1ad10 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
1ad20 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a  t( subpage>0 );.
1ad30 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1ad40 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
1ad50 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1ad60 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
1ad70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
1ad80 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1ad90 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  = ((pRoot->nCell
1ada0 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44  >0)?CURSOR_VALID
1adb0 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29  :CURSOR_INVALID)
1adc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1add0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1ade0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1adf0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
1ae00 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
1ae10 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
1ae20 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
1ae30 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1ae40 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
1ae50 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
1ae60 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1ae70 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
1ae80 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
1ae90 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
1aea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aeb0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
1aec0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1aed0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
1aee0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1aef0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
1af00 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1af10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1af20 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1af30 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1af40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1af50 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
1af60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
1af70 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1af80 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
1af90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
1afa0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1afb0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1afc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1afd0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1afe0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1aff0 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
1b000 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
1b010 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1b020 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
1b030 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1b050 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
1b060 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
1b070 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
1b080 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
1b090 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
1b0a0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1b0b0 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
1b0c0 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
1b0d0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
1b0e0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
1b0f0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
1b100 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
1b110 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
1b120 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
1b130 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
1b140 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
1b150 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
1b160 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
1b170 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1b180 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
1b190 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
1b1a0 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
1b1b0 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
1b1c0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
1b1d0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
1b1e0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1b1f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1b200 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
1b210 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
1b220 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
1b230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b240 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b250 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1b260 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1b270 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1b280 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1b290 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1b2a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1b2b0 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
1b2c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1b2d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
1b2e0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
1b2f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1b300 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1b310 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1b320 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1b330 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
1b340 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1b350 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1b360 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1b370 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1b380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
1b390 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1b3a0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
1b3b0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
1b3c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1b3d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
1b3e0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
1b3f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b400 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1b410 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
1b420 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1b430 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1b440 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1b450 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1b460 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1b470 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1b480 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1b490 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1b4a0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1b4b0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1b4c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
1b4d0 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
1b4e0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1b4f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1b500 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1b510 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1b520 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b530 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1b540 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1b550 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1b560 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1b570 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1b590 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b5a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1b5b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1b5c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1b5d0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1b5e0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1b5f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
1b600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1b620 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1b630 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1b640 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
1b650 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1b660 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1b670 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1b680 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b690 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1b6a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1b6b0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1b6c0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1b6d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1b6e0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1b6f0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1b700 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1b710 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1b720 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1b730 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1b740 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1b750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b760 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
1b770 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1b780 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1b790 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
1b7a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1b7b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1b7c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b7d0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1b7e0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1b7f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1b800 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1b810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b820 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
1b830 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1b840 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
1b850 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1b860 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1b870 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1b880 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1b8a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1b8b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b8c0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1b8d0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1b8e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1b8f0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74  pCur);.      get
1b900 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1b910 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
1b920 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
1b930 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1b940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b950 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1b960 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1b970 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
1b980 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
1b990 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
1b9a0 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
1b9b0 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
1b9c0 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
1b9d0 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
1b9e0 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
1b9f0 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
1ba00 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
1ba10 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
1ba20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
1ba30 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
1ba40 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
1ba50 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
1ba60 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
1ba70 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
1ba80 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
1ba90 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
1baa0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
1bab0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
1bac0 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
1bad0 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
1bae0 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
1baf0 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
1bb00 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
1bb10 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
1bb20 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
1bb30 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  key..**.** The r
1bb40 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1bb50 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
1bb60 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
1bb70 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ch the.** cursor
1bb80 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
1bb90 70 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55  pRes if pRes!=NU
1bba0 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  LL.  The meaning
1bbb0 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75   of.** this valu
1bbc0 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  e is as follows:
1bbd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1bbe0 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
1bbf0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1bc00 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1bc10 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1bc20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
1bc30 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72  ler than pKey or
1bc40 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1bc50 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
1bc60 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
1bc70 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
1bc80 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
1bc90 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
1bca0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
1bcb0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1bcc0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1bcd0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1bce0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1bcf0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
1bd00 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a  tches pKey..**.*
1bd10 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
1bd20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1bd30 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1bd40 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1bd50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1bd60 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
1bd70 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  an pKey..**.*/.i
1bd80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
1bd90 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
1bda0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1bdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bdc0 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
1bdd0 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
1bde0 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
1bdf0 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
1be00 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
1be10 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
1be20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
1be30 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
1be40 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
1be50 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
1be60 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
1be70 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
1be80 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bea0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
1beb0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
1bec0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1bed0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bee0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bef0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1bf00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1bf10 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1bf20 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
1bf30 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1bf40 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
1bf50 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
1bf60 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
1bf70 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
1bf80 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
1bf90 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
1bfa0 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
1bfb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1bfc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
1bfd0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a  Cur->validNKey .
1bfe0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
1bff0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
1c000 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
1c010 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
1c020 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1c030 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
1c040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c050 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
1c060 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
1c070 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
1c080 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
1c090 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
1c0a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c0b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1c0c0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1c0d0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1c0e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1c0f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c100 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1c110 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
1c120 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1c130 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1c140 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
1c150 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1c160 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1c170 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
1c180 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1c190 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1c1a0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
1c1b0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
1c1c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1c1d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1c1e0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
1c1f0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
1c200 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
1c210 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50   lwr, upr;.    P
1c220 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
1c230 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1c240 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1c250 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
1c260 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20  int c = -1;  /* 
1c270 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74  pRes return if t
1c280 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75  able is empty mu
1c290 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20  st be -1 */.    
1c2a0 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
1c2b0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
1c2c0 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  1;.    if( !pPag
1c2d0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64  e->intKey && pId
1c2e0 78 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  xKey==0 ){.     
1c2f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1c300 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1c310 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1c320 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ish;.    }.    i
1c330 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
1c340 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1c350 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1c360 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   upr;.    }else{
1c370 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
1c380 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1c390 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20  = (upr+lwr)/2;. 
1c3a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72     }.    if( lwr
1c3b0 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b  <=upr ) for(;;){
1c3c0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65  .      void *pCe
1c3d0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34  llKey;.      i64
1c3e0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
1c3f0 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
1c400 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1c410 67 65 5d 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ge];.      pCur-
1c420 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1c430 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
1c440 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
1c450 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1c460 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Key ){.        u
1c470 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
1c480 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
1c490 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
1c4a0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
1c4b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
1c4c0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
1c4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
1c4e0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
1c4f0 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
1c500 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64  arint32(pCell, d
1c510 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
1c520 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
1c530 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
1c540 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
1c550 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
1c560 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
1c570 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
1c580 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1c590 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
1c5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1c5b0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1c5c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
1c5d0 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e  ert( nCellKey>in
1c5e0 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
1c5f0 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
1c600 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1c610 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61  .        int ava
1c620 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ilable;.        
1c630 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64  pCellKey = (void
1c640 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28   *)fetchPayload(
1c650 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65  pCur, &available
1c660 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  , 0);.        nC
1c670 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69  ellKey = pCur->i
1c680 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
1c690 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e    if( available>
1c6a0 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  =nCellKey ){.   
1c6b0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1c6c0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1c6d0 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  are(nCellKey, pC
1c6e0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
1c6f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c700 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1c710 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
1c720 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  loc( nCellKey );
1c730 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c740 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
1c750 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c760 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1c770 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1c780 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c7a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1c7b0 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
1c7c0 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64   nCellKey, (void
1c7d0 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20   *)pCellKey);.  
1c7e0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1c7f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c800 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70  pare(nCellKey, p
1c810 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
1c820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1c830 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
1c840 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
1c850 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
1c860 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1c870 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c880 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
1c890 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1c8a0 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1c8b0 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
1c8c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1c8d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1c8e0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
1c8f0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
1c900 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
1c910 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c930 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
1c940 73 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  s ) *pRes = 0;. 
1c950 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c970 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1c980 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
1c990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c9a0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
1c9b0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
1c9c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c9d0 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
1c9e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c9f0 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20  f( lwr>upr ){.  
1ca00 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1ca10 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
1ca20 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1ca30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ca40 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1ca50 3e 69 50 61 67 65 5d 20 3d 20 28 6c 77 72 2b 75  >iPage] = (lwr+u
1ca60 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20  pr)/2;.    }.   
1ca70 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
1ca80 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
1ca90 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1caa0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1cab0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1cac0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
1cad0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1cae0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1caf0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1cb00 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1cb10 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1cb20 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1cb30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
1cb40 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
1cb50 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
1cb60 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
1cb70 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
1cb80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cb90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1cba0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1cbb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1cbc0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
1cbd0 20 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52    if( pRes ) *pR
1cbe0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
1cbf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cc00 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1cc10 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
1cc20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1cc30 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 6c 77 72  ur->iPage] = lwr
1cc40 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1cc50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1cc60 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1cc70 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
1cc80 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1cc90 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
1cca0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
1ccb0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
1ccc0 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
1ccd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cce0 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
1ccf0 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
1cd00 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
1cd10 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
1cd20 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
1cd30 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
1cd40 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1cd50 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
1cd60 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
1cd70 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
1cd80 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
1cd90 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
1cda0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1cdb0 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
1cdc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1cdd0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
1cde0 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
1cdf0 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
1ce00 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1ce10 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
1ce20 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
1ce30 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
1ce40 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
1ce50 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
1ce60 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
1ce70 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
1ce80 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
1ce90 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
1cea0 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
1ceb0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1cec0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1ced0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1cee0 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
1cef0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
1cf00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1cf10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
1cf20 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
1cf30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1cf40 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
1cf50 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
1cf60 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1cf70 6f 72 64 20 61 53 70 61 63 65 5b 31 36 5d 3b 20  ord aSpace[16]; 
1cf80 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
1cf90 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
1cfa0 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
1cfb0 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
1cfc0 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
1cfd0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1cfe0 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
1cff0 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79  Info, nKey, pKey
1d000 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20          aSpace, 
1d030 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b  sizeof(aSpace));
1d040 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
1d050 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1d060 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
1d070 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
1d080 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
1d090 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1d0a0 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
1d0b0 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
1d0c0 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
1d0d0 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73  f( pKey ){.    s
1d0e0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
1d0f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70  UnpackedRecord(p
1d100 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72  IdxKey);.  }.  r
1d110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1d120 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1d130 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1d140 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
1d150 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1d160 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
1d170 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
1d180 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
1d190 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
1d1a0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
1d1b0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
1d1c0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1d1d0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
1d1e0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
1d1f0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
1d200 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
1d210 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
1d220 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1d230 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1d240 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
1d250 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
1d260 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
1d270 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
1d280 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1d290 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
1d2a0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
1d2b0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
1d2c0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
1d2d0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
1d2e0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
1d2f0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
1d300 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
1d310 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
1d320 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
1d330 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
1d340 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
1d350 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d360 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d370 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 61  ion handle for a
1d380 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69   cursor..*/.sqli
1d390 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72 65  te3 *sqlite3Btre
1d3a0 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74 20  eCursorDb(const 
1d3b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d3c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d3d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1d3e0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1d3f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
1d400 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  rn pCur->pBtree-
1d410 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  >db;.}../*.** Ad
1d420 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
1d430 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
1d440 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1d450 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
1d460 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
1d470 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
1d480 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
1d490 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
1d4a0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1d4b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1d4c0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
1d4d0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
1d4e0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
1d4f0 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
1d500 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
1d510 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1d520 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1d530 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
1d540 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1d550 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1d560 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d570 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1d580 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1d590 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1d5a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d5b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d5c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
1d5d0 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
1d5e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1d5f0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1d600 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1d610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d620 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1d630 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
1d640 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1d650 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1d660 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d670 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1d680 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
1d690 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1d6a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1d6b0 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
1d6c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1d6d0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
1d6e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1d6f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
1d700 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
1d710 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
1d720 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1d730 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1d740 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
1d750 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1d760 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1d770 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
1d780 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1d790 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1d7a0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1d7b0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
1d7c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1d7d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
1d7e0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
1d7f0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
1d800 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1d810 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d820 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
1d830 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
1d840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
1d850 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1d860 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1d870 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1d880 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1d890 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1d8a0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1d8b0 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1d8c0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1d8d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1d8e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1d8f0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
1d900 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1d910 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
1d920 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
1d930 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1d940 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1d950 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d960 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
1d970 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
1d980 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1d990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d9a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d9b0 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1d9c0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1d9d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1d9e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d9f0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1da00 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
1da10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1da20 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
1da30 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
1da40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
1da50 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1da60 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1da70 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1da80 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1da90 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1daa0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1dab0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
1dac0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1dad0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
1dae0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
1daf0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
1db00 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
1db10 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1db20 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
1db30 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1db40 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
1db50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1db60 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1db70 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1db80 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1db90 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1dba0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
1dbb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dbc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1dbd0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
1dbe0 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
1dbf0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1dc00 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
1dc10 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
1dc20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1dc30 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
1dc40 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip<0 ){.    pCur
1dc50 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
1dc60 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
1dc70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1dc80 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
1dc90 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
1dca0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1dcb0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1dcc0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1dcd0 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
1dce0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1dcf0 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
1dd00 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1dd10 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
1dd20 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1dd30 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
1dd40 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
1dd50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1dd60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1dd70 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1dd80 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1dd90 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
1dda0 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( 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 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
1ddd0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
1dde0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
1ddf0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1de00 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1de10 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1de20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1de30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1de40 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1de50 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1de60 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
1de70 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1de80 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1de90 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1dea0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
1deb0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
1dec0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
1ded0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1dee0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
1def0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
1df00 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1df10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1df20 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1df30 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
1df40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1df60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
1df70 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
1df80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
1df90 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1dfa0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1dfb0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
1dfc0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
1dfd0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
1dfe0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1dff0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
1e000 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
1e010 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1e020 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1e030 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
1e040 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
1e050 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
1e060 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
1e070 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
1e080 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
1e090 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1e0a0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
1e0b0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
1e0c0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
1e0d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e0e0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
1e0f0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
1e100 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1e110 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
1e120 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
1e130 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
1e140 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
1e150 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
1e160 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
1e170 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1e180 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
1e190 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e1a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1e1b0 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
1e1c0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
1e1d0 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
1e1e0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1e1f0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
1e200 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
1e210 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
1e220 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
1e230 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
1e240 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
1e250 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
1e260 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
1e270 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
1e280 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
1e290 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
1e2a0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
1e2b0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
1e2c0 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
1e2d0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1e2e0 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
1e2f0 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
1e300 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
1e310 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
1e320 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
1e330 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
1e340 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
1e350 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
1e360 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1e370 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
1e380 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
1e390 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1e3a0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1e3b0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1e3c0 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
1e3d0 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
1e3e0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
1e3f0 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
1e400 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
1e410 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
1e420 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
1e430 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e440 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1e450 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
1e460 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
1e470 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
1e480 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
1e490 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
1e4a0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
1e4b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
1e4c0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20  evTrunk = 0;..  
1e4d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e4e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1e4f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
1e500 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1e510 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1e520 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1e530 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20  36]);.  if( n>0 
1e540 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
1e550 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
1e560 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
1e570 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
1e580 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
1e590 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
1e5a0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1e5b0 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
1e5c0 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
1e5d0 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
1e5e0 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
1e5f0 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
1e600 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
1e610 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
1e620 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
1e630 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
1e640 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
1e650 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
1e660 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1e670 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
1e680 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
1e690 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
1e6a0 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
1e6b0 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
1e6c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e6d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1e6e0 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c  exact && nearby<
1e6f0 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
1e700 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1e710 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
1e720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
1e730 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
1e740 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1e750 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
1e760 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1e770 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
1e780 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
1e790 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1e7a0 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
1e7b0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1e7c0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
1e7d0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
1e7e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
1e7f0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
1e800 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1e810 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
1e820 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
1e830 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
1e840 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
1e850 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
1e860 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
1e870 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
1e880 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
1e890 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
1e8a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e8b0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1e8c0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1e8d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1e8e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1e8f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1e900 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
1e910 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
1e920 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
1e930 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
1e940 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
1e950 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
1e960 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
1e970 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
1e980 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
1e990 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
1e9a0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
1e9b0 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
1e9c0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
1e9d0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
1e9e0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
1e9f0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
1ea00 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
1ea10 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
1ea20 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1ea30 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1ea40 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
1ea50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
1ea60 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1ea70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1ea80 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1ea90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1eaa0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1eab0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
1eac0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1ead0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
1eae0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1eaf0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1eb00 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
1eb10 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
1eb20 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1eb30 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
1eb40 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
1eb50 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
1eb60 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
1eb70 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
1eb80 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
1eb90 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
1eba0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
1ebb0 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
1ebc0 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
1ebd0 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
1ebe0 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
1ebf0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
1ec00 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1ec10 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
1ec20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1ec30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1ec40 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1ec50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1ec60 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1ec70 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1ec80 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1ec90 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
1eca0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
1ecb0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1ecc0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1ecd0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1ece0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
1ecf0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
1ed00 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1ed10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1ed20 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1ed30 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1ed40 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1ed50 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1ed60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ed70 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  k>pBt->usableSiz
1ed80 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20  e/4 - 2 ){.     
1ed90 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
1eda0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1edb0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
1edc0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1edd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1ede0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1edf0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1ee00 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
1ee10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ee20 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1ee30 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
1ee40 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d  hList && nearby=
1ee50 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =iTrunk ){.     
1ee60 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
1ee70 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
1ee80 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
1ee90 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
1eea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
1eeb0 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
1eec0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
1eed0 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
1eee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1eef0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d   assert( *pPgno=
1ef00 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20  =iTrunk );.     
1ef10 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1ef20 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
1ef30 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
1ef40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ef50 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1ef60 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1ef70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1ef80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1ef90 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1efa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1efb0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
1efc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1efd0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1efe0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1eff0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1f000 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1f010 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1f020 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f030 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1f040 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1f050 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
1f060 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1f070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f090 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
1f0a0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
1f0b0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
1f0c0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
1f0d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
1f0e0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
1f0f0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
1f100 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
1f110 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
1f120 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
1f130 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
1f140 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1f150 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
1f160 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
1f170 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
1f180 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1f190 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
1f1a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f1b0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1f1c0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
1f1d0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
1f1e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f1f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f200 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1f210 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1f220 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f230 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f240 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f250 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
1f260 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1f270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1f290 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1f2a0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1f2b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1f2c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1f2d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f2e0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1f2f0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
1f300 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1f310 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
1f320 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
1f330 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
1f340 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
1f350 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
1f360 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
1f370 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
1f380 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
1f390 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1f3a0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1f3b0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
1f3c0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1f3d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1f3e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1f3f0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1f400 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f410 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f420 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f430 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
1f440 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1f450 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1f460 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1f470 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1f480 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1f490 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1f4a0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1f4b0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
1f4c0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1f4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1f4e0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1f4f0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
1f500 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1f510 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
1f520 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
1f530 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
1f540 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
1f550 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
1f560 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
1f570 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
1f580 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73        int closes
1f590 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
1f5a0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
1f5b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
1f5c0 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
1f5d0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ata;.        rc 
1f5e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f5f0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1f600 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1f610 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1f620 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1f630 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1f640 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1f650 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
1f660 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73        int i, dis
1f670 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  t;.          clo
1f680 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
1f690 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62      dist = get4b
1f6a0 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
1f6b0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1f6c0 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20     if( dist<0 ) 
1f6d0 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20  dist = -dist;.  
1f6e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
1f6f0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
1f700 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
1f710 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1f720 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
1f730 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
1f740 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d  f( d2<0 ) d2 = -
1f750 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
1f760 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
1f780 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
1f790 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
1f7a0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
1f7b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f7c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f7d0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
1f7e0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1f7f0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
1f800 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
1f810 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
1f820 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
1f830 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e  List || iPage==n
1f840 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
1f850 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
1f860 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
1f870 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1f880 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50    nPage = pagerP
1f890 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1f8a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
1f8b0 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67   if( *pPgno>nPag
1f8c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1f8d0 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66   /* Free page of
1f8e0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
1f8f0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
1f900 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f910 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f920 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1f930 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1f940 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1f950 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
1f960 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
1f970 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
1f980 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
1f9a0 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
1f9b0 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
1f9c0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
1f9d0 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
1f9e0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
1f9f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
1fa00 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
1fa10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1fa20 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
1fa30 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
1fa40 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
1fa50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fa60 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
1fa70 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
1fa80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fa90 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1faa0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1fab0 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ge, 1);.        
1fac0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1fae0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
1faf0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70  ontRollback((*pp
1fb00 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
1fb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fb20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1fb30 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
1fb40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1fb50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fb60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fb70 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1fb80 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
1fb90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fbb0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
1fbc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fbd0 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
1fbe0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
1fbf0 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
1fc00 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
1fc10 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
1fc20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1fc30 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
1fc40 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1fc50 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65  elist, so create
1fc60 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74   a new page at t
1fc70 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  he.    ** end of
1fc80 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1fc90 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67   int nPage = pag
1fca0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1fcb0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 2a 70  >pPager);.    *p
1fcc0 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31  Pgno = nPage + 1
1fcd0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1fce0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fcf0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  M.    if( pBt->n
1fd00 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f  Trunc ){.      /
1fd10 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d  * An incr-vacuum
1fd20 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
1fd30 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
1fd40 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65  nsaction. So the
1fd50 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74  .      ** page t
1fd60 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f  o allocate is no
1fd70 74 20 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69  t from the physi
1fd80 63 61 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66  cal end of the f
1fd90 69 6c 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a  ile, but.      *
1fda0 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63  * at pBt->nTrunc
1fdb0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1fdc0 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
1fdd0 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20  nTrunc+1;.      
1fde0 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
1fdf0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fe00 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a  t) ){.        (*
1fe10 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20  pPgno)++;.      
1fe20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1fe30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1fe40 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
1fe50 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b  (pBt, *pPgno) ){
1fe60 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
1fe70 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
1fe80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1fe90 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
1fea0 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
1feb0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
1fec0 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
1fed0 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
1fee0 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
1fef0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
1ff00 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
1ff10 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
1ff20 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
1ff30 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
1ff40 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43     */.      TRAC
1ff50 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1ff60 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
1ff70 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
1ff80 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
1ff90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ffa0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1ffb0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ffc0 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  );.      (*pPgno
1ffd0 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  )++;.      if( *
1ffe0 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
1fff0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
20000 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20   (*pPgno)++; }. 
20010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
20020 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
20030 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
20040 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65  *pPgno;.    }.#e
20050 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
20060 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
20070 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20080 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
20090 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
200a0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
200b0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
200c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
200d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
200e0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
200f0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
20100 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20120 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
20130 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
20140 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
20150 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
20160 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
20170 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
20180 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
20190 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
201a0 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
201b0 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
201c0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
201d0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
201e0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
201f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20200 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
20210 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
20220 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
20230 31 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  1 ){.    release
20240 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
20250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20260 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20270 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20280 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70  }../*.** Add a p
20290 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
202a0 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
202b0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
202c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
202d0 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65  f() is NOT calle
202e0 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  d for pPage..*/.
202f0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
20300 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
20310 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
20320 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
20330 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
20340 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
20350 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c  e1;.  int rc, n,
20360 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72   k;..  /* Prepar
20370 65 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66  e the page for f
20380 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65  reeing */.  asse
20390 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
203a0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
203b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
203c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
203d0 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d  no>1 );.  pPage-
203e0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 0a 20 20  >isInit = 0;..  
203f0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
20400 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
20410 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
20420 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20430 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
20440 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
20450 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20460 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
20470 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
20480 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
20490 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
204a0 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20  , n+1);..#ifdef 
204b0 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
204c0 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65  LETE.  /* If the
204d0 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
204e0 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69  ELETE compile-ti
204f0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  me option is ena
20500 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  bled, then.  ** 
20510 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
20520 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
20530 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
20540 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  zeros..  */.  rc
20550 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20560 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
20570 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
20580 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
20590 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
205a0 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
205b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e  ->pageSize);.#en
205c0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
205d0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
205e0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
205f0 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
20600 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
20610 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
20620 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
20630 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
20640 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
20650 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  M ){.    rc = pt
20660 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
20670 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
20680 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
20690 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
206a0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
206b0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( n==0 ){.    /*
206c0 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
206d0 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a  st free page */.
206e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
206f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
20700 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20710 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20720 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  rc;.    memset(p
20730 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
20740 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  8);.    put4byte
20750 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
20760 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
20770 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 46  );.    TRACE(("F
20780 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72  REE-PAGE: %d fir
20790 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  st\n", pPage->pg
207a0 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no));.  }else{. 
207b0 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65     /* Other free
207c0 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 65   pages already e
207d0 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20 74  xist.  Retrive t
207e0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  he first trunk p
207f0 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  age.    ** of th
20800 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66  e freelist and f
20810 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ind out how many
20820 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e 20   leaves it has. 
20830 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
20840 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d  pTrunk;.    rc =
20850 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
20860 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
20870 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20880 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c  a[32]), &pTrunk,
20890 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
208a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
208b0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
208c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
208d0 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74  ;.    if( k>=pBt
208e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
208f0 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54   8 ){.      /* T
20900 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c  he trunk is full
20910 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65  .  Turn the page
20920 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74   being freed int
20930 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a  o a new.      **
20940 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68   trunk page with
20950 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20 20 20 20   no leaves..    
20960 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
20970 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
20980 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
20990 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
209a0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
209b0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
209c0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
209d0 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
209e0 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
209f0 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
20a00 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
20a10 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
20a20 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
20a30 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
20a40 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
20a50 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
20a60 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
20a70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
20a80 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
20a90 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
20aa0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
20ab0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
20ac0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
20ad0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
20ae0 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
20af0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
20b00 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
20b10 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
20b20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
20b30 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74  tain to restrict
20b40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
20b50 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
20b60 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
20b70 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
20b80 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
20b90 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
20ba0 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
20bb0 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
20bc0 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
20bd0 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
20be0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
20bf0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
20c00 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
20c10 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
20c20 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
20c30 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
20c40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20c50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20c60 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
20c70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
20c80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20c90 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
20ca0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
20cb0 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
20cc0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20cd0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
20ce0 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  4], 0);.        
20cf0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
20d00 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
20d10 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
20d20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
20d30 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
20d40 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
20d50 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g %d\n",.       
20d60 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
20d70 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
20d80 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
20d90 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30 20    }else if( k<0 
20da0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20db0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
20dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
20dd0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
20de0 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
20df0 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
20e00 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
20e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20e20 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
20e30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20e40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
20e60 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
20e70 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
20e80 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20e90 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
20ea0 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
20eb0 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
20ec0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
20ed0 45 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ETE.        rc =
20ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
20ef0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
20f00 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  bPage);.#endif. 
20f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
20f20 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
20f30 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
20f40 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
20f50 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
20f60 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
20f70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
20f80 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  runk);.  }.  ret
20f90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20fa0 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
20fb0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
20fc0 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
20fd0 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
20fe0 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
20ff0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
21000 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21010 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
21020 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
21030 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
21040 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
21050 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
21060 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
21070 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a   int ovflPageSiz
21080 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
21090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
210a0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
210b0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
210c0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
210d0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
210e0 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
210f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
21100 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21110 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
21120 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
21130 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
21140 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
21150 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
21160 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
21170 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
21180 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69  ]);.  ovflPageSi
21190 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
211a0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
211b0 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
211c0 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
211d0 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
211e0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
211f0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
21200 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
21210 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
21220 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d  nOvfl-- ){.    M
21230 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20  emPage *pOvfl;. 
21240 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d     if( ovflPgno=
21250 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70  =0 || ovflPgno>p
21260 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
21270 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
21280 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21290 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
212a0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
212b0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
212c0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
212d0 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30  pOvfl, (nOvfl==0
212e0 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a  )?0:&ovflPgno);.
212f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
21300 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
21310 20 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29   freePage(pOvfl)
21320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
21330 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
21340 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
21350 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
21360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
21370 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21380 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
21390 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
213a0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
213b0 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
213c0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
213d0 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
213e0 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
213f0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
21400 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
21410 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
21420 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
21430 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
21440 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
21450 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
21460 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
21470 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
21480 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
21490 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
214a0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
214b0 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
214c0 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
214d0 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
214e0 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
214f0 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
21500 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
21510 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
21520 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
21530 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
21540 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
21550 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
21560 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
21570 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
21580 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
21590 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
215a0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
215b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
215c0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
215d0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
215e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
215f0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
21600 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
21610 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
21620 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
21630 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
21640 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
21650 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
21660 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
21670 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
21680 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
216a0 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
216b0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
216c0 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
216d0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
216e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
216f0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
21700 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
21710 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
21720 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
21730 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
21740 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
21750 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
21760 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
21770 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
21780 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
21790 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
217a0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
217b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
217c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
217d0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
217e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
217f0 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
21800 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
21810 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21820 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
21830 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  utex) );..  /* F
21840 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
21850 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
21860 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
21870 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
21880 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
21890 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
218a0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
218b0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
218c0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
218d0 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
218e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
218f0 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
21900 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
21910 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
21920 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
21930 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71  64*)&nKey);.  sq
21940 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
21950 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
21960 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
21970 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
21980 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
21990 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
219a0 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
219b0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
219c0 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29  a==nData+nZero )
219d0 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
219e0 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
219f0 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
21a00 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
21a10 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
21a20 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
21a30 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
21a40 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
21a50 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
21a60 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
21a70 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
21a80 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
21a90 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  = nKey;.  }.  *p
21aa0 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
21ab0 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
21ac0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
21ad0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
21ae0 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
21af0 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
21b00 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
21b10 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
21b20 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
21b30 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
21b40 20 20 20 20 20 20 69 6e 74 20 69 73 45 78 61 63        int isExac
21b50 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  t = 0;.#ifndef S
21b60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21b70 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
21b80 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
21b90 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
21ba0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
21bb0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
21bc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
21bd0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
21be0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
21bf0 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
21c00 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
21c10 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
21c20 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
21c30 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
21c40 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
21c50 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
21c60 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
21c70 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e     if( pgnoOvfl>
21c80 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 ){.          /
21c90 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a  * isExact = 1; *
21ca0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
21cb0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
21cc0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
21cd0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
21ce0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
21cf0 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63  pgnoOvfl, isExac
21d00 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
21d10 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21d20 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
21d30 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
21d40 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
21d50 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
21d60 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
21d70 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
21d80 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
21d90 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
21da0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
21db0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
21dc0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
21dd0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
21de0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
21df0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
21e00 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
21e10 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
21e20 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
21e30 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
21e40 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
21e50 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
21e60 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
21e70 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
21e80 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
21e90 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
21ea0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
21eb0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
21ec0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
21ed0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
21ee0 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
21ef0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
21f00 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
21f10 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21f20 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
21f30 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
21f40 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
21f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21f60 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
21f70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
21f80 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
21f90 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
21fa0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
21fb0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
21fc0 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
21fd0 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
21fe0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
21ff0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
22000 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
22010 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
22020 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
22030 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
22040 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
22050 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22060 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
22070 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
22080 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
22090 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
220a0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
220b0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
220c0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
220d0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
220e0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
220f0 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
22100 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
22110 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
22120 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
22130 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
22140 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
22150 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
22160 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
22170 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
22180 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e  eLeft;.    if( n
22190 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
221a0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
221b0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
221c0 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
221d0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
221e0 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
221f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
22200 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
22210 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
22220 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
22230 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
22240 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
22250 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
22260 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
22270 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
22280 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
22290 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
222a0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
222b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
222c0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
222d0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
222e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
222f0 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
22300 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
22310 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22320 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
22330 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
22340 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
22350 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
22360 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
22370 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
22380 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
22390 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
223a0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
223b0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
223c0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
223d0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
223e0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
223f0 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
22400 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
22410 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
22420 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
22430 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
22440 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
22450 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
22460 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
22470 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22480 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
22490 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
224a0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
224b0 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
224c0 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
224d0 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
224e0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
224f0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
22500 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
22510 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
22520 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20  hin data[] */.. 
22530 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
22540 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
22550 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
22560 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
22570 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
22580 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
22590 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
225a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
225b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
225c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
225d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
225e0 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
225f0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
22600 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
22610 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
22620 69 64 78 5d 3b 0a 20 20 2f 2a 20 6d 61 73 6b 20  idx];.  /* mask 
22630 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74 20  the cell offset 
22640 74 6f 20 65 6e 73 75 72 65 20 61 20 63 6f 72 72  to ensure a corr
22650 75 70 74 20 64 62 20 64 6f 65 73 20 6e 6f 74 20  upt db does not 
22660 72 65 73 75 6c 74 20 69 6e 20 61 20 63 72 61 73  result in a cras
22670 68 20 2a 2f 0a 20 20 70 63 20 3d 20 70 50 61 67  h */.  pc = pPag
22680 65 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  e->maskPage & ge
22690 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61  t2byte(ptr);.  a
226a0 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20  ssert( pc>10 && 
226b0 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42  pc+sz<=pPage->pB
226c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
226d0 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61  .  freeSpace(pPa
226e0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66  ge, pc, sz);.  f
226f0 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
22700 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
22710 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
22720 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
22730 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
22740 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
22750 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
22760 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
22770 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
22780 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
22790 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
227a0 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   2;.}../*.** Ins
227b0 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
227c0 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
227d0 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
227e0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
227f0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
22800 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
22810 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
22820 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
22830 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
22840 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
22850 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
22860 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
22870 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
22880 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
22890 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
228a0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
228b0 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
228c0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
228d0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
228e0 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
228f0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
22900 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
22910 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
22920 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
22930 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
22940 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
22950 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
22960 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
22970 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
22980 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
22990 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
229a0 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
229b0 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
229c0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
229d0 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
229e0 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
229f0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
22a00 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
22a10 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
22a20 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
22a30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
22a40 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
22a50 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
22a60 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
22a70 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
22a80 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
22a90 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
22aa0 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
22ab0 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
22ac0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
22ad0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
22ae0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
22af0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
22b00 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
22b10 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
22b20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
22b30 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
22b40 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
22b50 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
22b60 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
22b70 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
22b80 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
22b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
22ba0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
22bb0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
22bc0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
22bd0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
22be0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
22bf0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75  if needed */.  u
22c00 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20  8 nSkip         
22c10 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65   /* Do not write
22c20 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
22c30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
22c40 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ll */.){.  int i
22c50 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
22c60 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
22c70 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
22c80 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
22c90 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
22ca0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22cb0 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
22cc0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
22cd0 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74   byte of content
22ce0 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e   for any cell in
22cf0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
22d00 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
22d10 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
22d20 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
22d30 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
22d40 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
22d50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
22d60 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
22d70 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
22d80 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
22d90 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
22da0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
22db0 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74  into data[] of t
22dc0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
22dd0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
22de0 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
22df0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
22e00 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
22e10 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
22e20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22e30 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
22e40 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
22e50 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
22e60 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
22e70 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
22e80 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
22e90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  */..  assert( i>
22ea0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
22eb0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
22ec0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
22ed0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
22ee0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
22ef0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
22f00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22f10 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
22f20 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
22f30 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
22f40 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
22f50 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
22f60 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
22f70 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
22f80 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
22f90 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
22fa0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
22fb0 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
22fc0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
22fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73  .    assert( j<s
22fe0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
22ff0 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
23000 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20  ->aOvfl[0]) );. 
23010 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
23020 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  j].pCell = pCell
23030 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
23040 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20  fl[j].idx = i;. 
23050 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
23060 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
23070 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
23080 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
23090 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
230a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
230b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
230c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
230d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
230e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
230f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
23100 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
23110 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
23120 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
23130 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f  drOffset;.    to
23140 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
23150 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
23160 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
23170 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
23180 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
23190 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
231a0 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69  nCell + 2;.    i
231b0 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
231c0 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65  + 2*i;.    if( e
231d0 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b  nd > top - sz ){
231e0 0a 20 20 20 20 20 20 64 65 66 72 61 67 6d 65 6e  .      defragmen
231f0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
23200 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
23210 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
23220 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
23230 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
23240 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
23250 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
23260 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
23270 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
23280 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
23290 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
232a0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
232b0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
232c0 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
232d0 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65  ree -= 2;.    me
232e0 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
232f0 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
23300 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
23310 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20     for(j=end-2, 
23320 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e  ptr=&data[j]; j>
23330 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d  ins; j-=2, ptr-=
23340 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d  2){.      ptr[0]
23350 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20   = ptr[-2];.    
23360 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d    ptr[1] = ptr[-
23370 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75  1];.    }.    pu
23380 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
23390 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
233a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
233b0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
233c0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
233d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
233e0 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
233f0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
23400 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
23410 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
23420 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
23430 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
23440 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
23450 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
23460 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
23470 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
23480 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
23490 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c     */.      Cell
234a0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
234b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
234c0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
234d0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
234e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
234f0 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
23500 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
23510 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
23520 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69  yload );.      i
23530 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  f( (info.nData+(
23540 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
23550 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f  info.nKey))>info
23560 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
23570 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
23580 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
23590 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
235a0 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  w]);.        rc 
235b0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  = ptrmapPut(pPag
235c0 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  e->pBt, pgnoOvfl
235d0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
235e0 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
235f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
23600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
23610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
23620 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
23630 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
23640 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23650 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
23660 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
23670 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
23680 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
23690 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
236a0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
236b0 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
236c0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
236d0 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
236e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
236f0 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
23700 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
23710 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
23720 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
23730 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
23740 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
23750 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
23760 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
23770 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
23780 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
23790 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
237a0 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
237b0 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
237c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
237d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
237e0 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b    int totalSize;
237f0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
23800 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a  e of all cells *
23810 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
23820 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
23830 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
23840 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20  .  int cellptr; 
23850 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
23860 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
23870 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
23880 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
23890 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
238a0 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
238b0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
238c0 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20  /* Data for the 
238d0 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
238e0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
238f0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
23900 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
23910 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
23920 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
23930 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20  otalSize = 0;.  
23940 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
23950 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61  ; i++){.    tota
23960 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69  lSize += aSize[i
23970 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
23980 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65   totalSize+2*nCe
23990 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  ll<=pPage->nFree
239a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
239b0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
239c0 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61  .  cellptr = pPa
239d0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
239e0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
239f0 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
23a00 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
23a10 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
23a20 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
23a30 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b  ;.  if( nCell ){
23a40 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  .    cellbody = 
23a50 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
23a60 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b  age, totalSize);
23a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c  .    assert( cel
23a80 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61  lbody>0 );.    a
23a90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
23aa0 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29  ree >= 2*nCell )
23ab0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
23ac0 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20  ee -= 2*nCell;. 
23ad0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
23ae0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
23af0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
23b00 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f  cellptr], cellbo
23b10 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  dy);.      memcp
23b20 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
23b30 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53  ], apCell[i], aS
23b40 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63  ize[i]);.      c
23b50 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20  ellptr += 2;.   
23b60 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61     cellbody += a
23b70 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  Size[i];.    }. 
23b80 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
23b90 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ody==pPage->pBt-
23ba0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
23bb0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
23bc0 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a  l = nCell;.}../*
23bd0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
23be0 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
23bf0 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
23c00 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
23c10 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
23c20 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
23c30 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
23c40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
23c50 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
23c60 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
23c70 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
23c80 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
23c90 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
23ca0 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a  n.  NB is the.**
23cb0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23cc0 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74   pages that part
23cd0 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69  icipate, includi
23ce0 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61  ng the target pa
23cf0 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69  ge and.** NN nei
23d00 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
23d10 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   side..**.** The
23d20 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
23d30 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f  f NN is 1 (of co
23d40 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69  urse).  Increasi
23d50 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a  ng NN above 1.**
23d60 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76   (to 2 or 3) giv
23d70 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72  es a modest impr
23d80 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43  ovement in SELEC
23d90 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72  T and DELETE per
23da0 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65  formance.** in e
23db0 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61  xchange for a la
23dc0 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e  rger degradation
23dd0 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55   in INSERT and U
23de0 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  PDATE performanc
23df0 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  e..** The value 
23e00 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f  of NN appears to
23e10 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72   give the best r
23e20 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a  esults overall..
23e30 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20  */.#define NN 1 
23e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23e50 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
23e60 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
23e70 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64  e of pPage */.#d
23e80 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31  efine NB (NN*2+1
23e90 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  )      /* Total 
23ea0 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  pages involved i
23eb0 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f  n the balance */
23ec0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
23ed0 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
23ee0 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43   int balance(BtC
23ef0 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23  ursor*, int);..#
23f00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23f10 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
23f20 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
23f30 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
23f40 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
23f50 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
23f60 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
23f70 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
23f80 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
23f90 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
23fa0 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
23fb0 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
23fc0 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
23fd0 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
23fe0 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
23ff0 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
24000 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
24010 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65  f trying balance
24020 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
24030 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
24040 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
24050 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
24060 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
24070 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
24080 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
24090 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
240a0 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
240b0 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
240c0 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
240d0 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
240e0 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
240f0 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
24100 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
24110 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
24120 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
24130 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
24140 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
24150 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
24160 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
24170 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
24180 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
24190 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
241a0 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
241b0 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
241c0 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
241d0 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
241e0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
241f0 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
24200 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
24210 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
24220 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
24230 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
24240 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24250 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
24260 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b  mPage *pNew = 0;
24270 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
24280 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
24290 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65  u16 szCell;.  Ce
242a0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 4d  llInfo info;.  M
242b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
242c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
242d0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 4d 65 6d  r->iPage];.  Mem
242e0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20  Page *pParent = 
242f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24300 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 42  r->iPage-1];.  B
24310 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
24320 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
24330 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61   parentIdx = pPa
24340 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f  rent->nCell;   /
24350 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69  * pParent new di
24360 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78  vider cell index
24370 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
24380 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
24390 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
243a0 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  of new divider c
243b0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65  ell */.  u8 pare
243c0 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20  ntCell[64];     
243d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
243e0 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
243f0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
24400 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24410 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
24420 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
24430 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
24440 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  te a new page. I
24450 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c  nsert the overfl
24460 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
24470 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e  ge.  ** into it.
24480 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   Then remove the
24490 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
244a0 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a  rom pPage..  */.
244b0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
244c0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
244d0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
244e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
244f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24500 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   pCell = pPage->
24510 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
24520 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c      szCell = cel
24530 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
24540 70 43 65 6c 6c 29 3b 0a 20 20 20 20 7a 65 72 6f  pCell);.    zero
24550 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65  Page(pNew, pPage
24560 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
24570 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
24580 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
24590 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  szCell);.    pPa
245a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
245b0 30 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50 61  0;.  .    /* pPa
245c0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
245d0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
245e0 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
245f0 67 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73  ge this.    ** s
24600 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74  o that the right
24610 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65  -child is the ne
24620 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64  w page allocated
24630 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20 2a   above and.    *
24640 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e  * pPage is the n
24650 65 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69  ext-to-right chi
24660 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ld. .    **.    
24670 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72 65  ** Ignore the re
24680 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
24690 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e  e call to fillIn
246a0 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65  Cell(). fillInCe
246b0 6c 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ll().    ** may 
246c0 6f 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68 65  only return othe
246d0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
246e0 20 69 66 20 69 74 20 69 73 20 72 65 71 75 69 72   if it is requir
246f0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  ed to allocate. 
24700 20 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72     ** one or mor
24710 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
24720 2e 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65 72  . Since an inter
24730 6e 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65 65  nal table B-Tree
24740 20 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d 61   cell .    ** ma
24750 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f 76  y never spill ov
24760 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72 66  er onto an overf
24770 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69 73 20  low page (it is 
24780 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20 20  a maximum of .  
24790 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69 6e    ** 13 bytes in
247a0 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f   size), it is no
247b0 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f 20  t neccessary to 
247c0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
247d0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   code..    **.  
247e0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
247f0 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29  the insertCell()
24800 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
24810 20 66 61 69 6c 20 69 66 20 74 68 65 20 70 61 67   fail if the pag
24820 65 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 69  e.    ** being i
24830 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73 20  nserted into is 
24840 61 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c 65  already writable
24850 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64 6f   and the cell do
24860 65 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 63  es not .    ** c
24870 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c  ontain an overfl
24880 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69  ow pointer. So i
24890 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75 72  gnore this retur
248a0 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20 20  n code too..    
248b0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
248c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
248d0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
248e0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
248f0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
24900 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
24910 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
24920 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
24930 0a 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  .    fillInCell(
24940 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43  pParent, parentC
24950 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
24960 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72  y, 0, 0, 0, &par
24970 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61 73  entSize);.    as
24980 73 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65  sert( parentSize
24990 3c 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  <64 );.    asser
249a0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
249b0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
249c0 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
249d0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
249e0 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64  Parent, parentId
249f0 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70  x, parentCell, p
24a00 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29  arentSize, 0, 4)
24a10 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66  ;.    put4byte(f
24a20 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
24a30 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64  pParent,parentId
24a40 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  x), pPage->pgno)
24a50 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
24a60 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
24a70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
24a80 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
24a90 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
24aa0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
24ab0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
24ac0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
24ad0 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
24ae0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
24af0 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
24b00 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
24b10 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
24b20 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
24b30 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
24b40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
24b50 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
24b60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
24b70 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
24b80 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
24b90 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
24ba0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
24bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24bc0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
24bd0 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29  PutOvfl(pNew, 0)
24be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24bf0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
24c00 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
24c10 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
24c20 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
24c30 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
24c40 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
24c50 20 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72 65   the pPage->nFre
24c60 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f  e variable is no
24c70 74 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 20  t set correctly 
24c80 77 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65 63  with.  ** respec
24c90 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  t to the content
24ca0 20 6f 66 20 74 68 65 20 70 61 67 65 20 28 62 65   of the page (be
24cb0 63 61 75 73 65 20 69 74 20 77 61 73 20 73 65 74  cause it was set
24cc0 20 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20 69   to 0 by .  ** i
24cd0 6e 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20 63  nsertCell). So c
24ce0 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65  all sqlite3Btree
24cf0 49 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d 61  InitPage() to ma
24d00 6b 65 20 73 75 72 65 20 69 74 20 69 73 0a 20 20  ke sure it is.  
24d10 2a 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a  ** correct..  **
24d20 0a 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20 74  .  ** This has t
24d30 6f 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20 69  o be done even i
24d40 66 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c 20  f an error will 
24d50 62 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f 72  be returned. Nor
24d60 6d 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20 61  mally, if.  ** a
24d70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
24d80 75 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61 6e  uring tree balan
24d90 63 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cing, the conten
24da0 74 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72  ts of MemPage ar
24db0 65 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72  e.  ** not impor
24dc0 74 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77 69  tant, as they wi
24dd0 6c 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61 74  ll be recalculat
24de0 65 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ed when the page
24df0 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
24e00 62 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c 20  back. But here, 
24e10 69 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  in balance_quick
24e20 28 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  (), it is possib
24e30 6c 65 20 74 68 61 74 20 70 50 61 67 65 20 68 61  le that pPage ha
24e40 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20  s .  ** not yet 
24e50 62 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72 74  been marked dirt
24e60 79 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e 74  y or written int
24e70 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24e80 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20 20  le. Therefore.  
24e90 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  ** it will not b
24ea0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
24eb0 64 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f 72  d so it is impor
24ec0 74 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  tant to make sur
24ed0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
24ee0 70 61 67 65 20 64 61 74 61 20 61 6e 64 20 63 6f  page data and co
24ef0 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67  ntents of MemPag
24f00 65 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74  e are consistent
24f10 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e  ..  */.  pPage->
24f20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 71  isInit = 0;.  sq
24f30 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
24f40 67 65 28 70 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  ge(pPage);..  /*
24f50 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 65   If everything e
24f60 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c 20 62  lse succeeded, b
24f70 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
24f80 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20 2a 2a  t page, in .  **
24f90 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65   case the divide
24fa0 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  r cell inserted 
24fb0 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63  caused it to bec
24fc0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20  ome overfull..  
24fd0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
24fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
24ff0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
25000 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  ;.    pCur->iPag
25010 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20 62 61  e--;.    rc = ba
25020 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a  lance(pCur, 0);.
25030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25040 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25050 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
25060 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LANCE */../*.** 
25070 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
25080 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73  istributes Cells
25090 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70   on pPage and up
250a0 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67   to NN*2 sibling
250b0 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f  s.** of pPage so
250c0 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
250d0 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73  have about the s
250e0 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
250f0 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75  ee space..** Usu
25100 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73  ally NN siblings
25110 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
25120 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64  of pPage is used
25130 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
25140 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72  g,.** though mor
25150 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  e siblings might
25160 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73   come from one s
25170 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20  ide if pPage is 
25180 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20  the first.** or 
25190 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
251a0 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50  s parent.  If pP
251b0 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68  age has fewer th
251c0 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73  an 2*NN siblings
251d0 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  .** (something w
251e0 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
251f0 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73  ppen if pPage is
25200 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
25210 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66  r a .** child of
25220 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20   root) then all 
25230 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
25240 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69  gs participate i
25250 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
25260 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
25270 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
25280 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20   pPage might be 
25290 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
252a0 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72  reased by one or
252b0 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66  .** two in an ef
252c0 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
252d0 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
252e0 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
252f0 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  . The root page.
25300 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e  ** is special an
25310 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  d is allowed to 
25320 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
25330 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a   If pPage is .**
25340 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
25350 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f  then the depth o
25360 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74  f the tree might
25370 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a   be increased.**
25380 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
25390 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61   one, as necessa
253a0 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20  ry, to keep the 
253b0 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62  root page from b
253c0 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  eing.** overfull
253d0 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   or completely e
253e0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  mpty..**.** Note
253f0 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
25400 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
25410 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43  d, some of the C
25420 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a  ells on pPage.**
25430 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
25440 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
25450 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
25460 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
25470 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
25480 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50   is overfull.  P
25490 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f  art of the job o
254a0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
254b0 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72  s to.** make sur
254c0 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20  e all Cells for 
254d0 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e  pPage once again
254e0 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61   fit in pPage->a
254f0 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e  Data[]..**.** In
25500 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
25510 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62  alancing the sib
25520 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20  lings of pPage, 
25530 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  the parent of pP
25540 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63  age.** might bec
25550 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
25560 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74  underfull.  If t
25570 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65  hat happens, the
25580 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
25590 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  * is called recu
255a0 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70  rsively on the p
255b0 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arent..**.** If 
255c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
255d0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
255e0 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
255f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
25600 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
25610 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74   state.  So if t
25620 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
25630 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
25640 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
25650 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
25660 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
25670 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73 6f 72  nonroot(BtCursor
25680 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
25690 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
256a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
256b0 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ver or underfull
256c0 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e 63 65   page to balance
256d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
256e0 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
256f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
25700 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42   of pPage */.  B
25710 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
25720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25730 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
25740 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
25750 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
25760 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25770 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
25780 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
25790 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
257a0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
257b0 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
257c0 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
257d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25800 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
25810 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25840 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
25850 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20   */.  int nDiv; 
25860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25870 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25880 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d  cells in apDiv[]
25890 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
258a0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
258b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
258c0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ers */.  int idx
258d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
258e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
258f0 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65  f pPage in pPare
25900 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
25910 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25930 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
25940 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
25950 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
25960 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25970 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25980 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
25990 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74   int leafCorrect
259a0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
259b0 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
259c0 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
259d0 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
259e0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
259f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
25a00 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
25a10 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
25a20 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
25a30 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
25a40 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
25a50 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
25a60 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
25a70 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
25a80 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
25a90 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
25aa0 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
25ab0 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
25ac0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
25ad0 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
25ae0 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
25af0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
25b00 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
25b10 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
25b20 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
25b30 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  e1[] */.  int iS
25b40 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20  pace2 = 0;      
25b50 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
25b60 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
25b70 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e  Space2[] */.  in
25b80 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
25b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
25ba0 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
25bb0 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
25bc0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
25bd0 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
25be0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
25bf0 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
25c00 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f   */.  Pgno pgnoO
25c10 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
25c20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
25c30 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
25c40 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
25c50 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
25c60 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
25c70 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
25c80 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
25c90 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
25ca0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
25cb0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
25cc0 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
25cd0 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
25ce0 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
25cf0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
25d00 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
25d10 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
25d20 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  e in apNew[] */.
25d30 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b    u8 *apDiv[NB];
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d50 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
25d60 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
25d70 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
25d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25d90 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
25da0 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
25db0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
25dc0 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
25dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
25de0 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
25df0 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
25e00 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
25e10 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
25e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
25e30 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
25e40 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
25e50 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
25e60 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
25e70 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
25e80 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
25e90 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42  /.  u8 *aCopy[NB
25ea0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  ];         /* Sp
25eb0 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
25ec0 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
25ed0 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
25ee0 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
25ef0 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
25f00 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
25f10 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e 63  ls before balanc
25f20 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  e */.  u8 *aSpac
25f30 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  e2 = 0;       /*
25f40 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72 66   Space for overf
25f50 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65 6c  low dividers cel
25f60 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 65  ls after balance
25f70 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20   */.  u8 *aFrom 
25f80 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
25f90 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25fa0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
25fb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25fc0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
25fd0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
25fe0 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
25ff0 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
26000 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  1 );..  /* .  **
26010 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   Find the parent
26020 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
26030 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
26040 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
26050 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
26060 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
26070 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
26080 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
26090 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  ge) || pPage->nO
260a0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
260b0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
260c0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 43  ;.  pParent = pC
260d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
260e0 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73  >iPage-1];.  ass
260f0 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a  ert( pParent );.
26100 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
26110 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
26120 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
26130 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20  ->pDbPage)) ){. 
26140 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26150 7d 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  }..  TRACE(("BAL
26160 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
26170 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
26180 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
26190 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
261a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
261b0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
261c0 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20  NCE.  /*.  ** A 
261d0 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  special case:  I
261e0 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61  f a new entry ha
261f0 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65  s just been inse
26200 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  rted into a.  **
26210 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c   table (that is,
26220 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69 6e   a btree with in
26230 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61  teger keys and a
26240 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20 6c  ll data at the l
26250 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20  eaves).  ** and 
26260 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
26270 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
26280 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
26290 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20 20  e (it has the.  
262a0 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20  ** largest key) 
262b0 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70 65  then use the spe
262c0 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  cial balance_qui
262d0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
262e0 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e  .  ** balancing.
262f0 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28    balance_quick(
26300 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72  ) is much faster
26310 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20   and results in 
26320 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70  a tighter.  ** p
26330 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69  acking of data i
26340 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
26350 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
26360 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20  age->leaf &&.   
26370 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
26380 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
26390 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26  >nOverflow==1 &&
263a0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  .      pPage->aO
263b0 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
263c0 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20  e->nCell &&.    
263d0 20 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21    pParent->pgno!
263e0 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74 34  =1 &&.      get4
263f0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
26400 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
26410 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61  rOffset+8])==pPa
26420 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20  ge->pgno.  ){.  
26430 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26440 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2f  >intKey );.    /
26450 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43  *.    ** TODO: C
26460 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67  heck the sibling
26470 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
26480 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62   pPage. It may b
26490 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
264a0 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20  ey are not full 
264b0 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20  and no new page 
264c0 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
264d0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62   */.    return b
264e0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 43 75  alance_quick(pCu
264f0 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  r);.  }.#endif..
26500 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
26510 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
26520 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
26530 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
26540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
26550 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
26560 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
26570 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73  parent page whos
26580 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69  e left child poi
26590 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f  nts back.  ** to
265a0 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64   pPage.  The "id
265b0 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74  x" variable is t
265c0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
265d0 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65   cell.  If pPage
265e0 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67  .  ** is the rig
265f0 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  htmost child of 
26600 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74  pParent then set
26610 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d   idx to pParent-
26620 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69  >nCell .  */.  i
26630 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
26640 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
26650 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
26660 6e 64 65 78 28 70 50 61 72 65 6e 74 2c 20 69 64  ndex(pParent, id
26670 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  x, pPage->pgno);
26680 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74  ..  /*.  ** Init
26690 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73  ialize variables
266a0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
266b0 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70   be safe to jump
266c0 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74  .  ** directly t
266d0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
266e0 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e  p at any moment.
266f0 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e  .  */.  nOld = n
26700 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a 20  New = 0;..  /*. 
26710 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
26720 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
26730 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
26740 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
26750 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
26760 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
26770 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
26780 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
26790 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
267a0 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
267b0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
267c0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
267d0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
267e0 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
267f0 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
26800 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
26810 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
26820 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
26830 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
26840 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
26850 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
26860 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
26870 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
26880 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
26890 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
268a0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
268b0 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
268c0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
268d0 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
268e0 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
268f0 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
26900 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
26910 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
26920 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
26930 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
26940 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
26950 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
26960 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
26970 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
26980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
26990 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
269a0 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
269b0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
269c0 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
269d0 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
269e0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
269f0 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
26a00 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
26a10 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
26a20 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
26a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
26a40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
26a50 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
26a60 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
26a70 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  [i], &apOld[i]);
26a80 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
26a90 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
26aa0 75 70 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c 64  up;.    /* apOld
26ab0 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
26ac0 20 6b 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f 70   k; */.    apCop
26ad0 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73  y[i] = 0;.    as
26ae0 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b  sert( i==nOld );
26af0 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20  .    nOld++;.   
26b00 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
26b10 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
26b20 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
26b30 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  low;.  }..  /* M
26b40 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20  ake nMaxCells a 
26b50 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e  multiple of 4 in
26b60 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72   order to preser
26b70 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61  ve 8-byte.  ** a
26b80 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d  lignment */.  nM
26b90 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43  axCells = (nMaxC
26ba0 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20  ells + 3)&~3;.. 
26bb0 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
26bc0 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
26bd0 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ry structures.  
26be0 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  */.  szScratch =
26bf0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
26c00 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
26c30 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
26c40 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c60 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
26c70 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28  .     + (ROUND8(
26c80 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
26c90 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a  +pBt->pageSize)*
26ca0 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a  NB  /* aCopy */.
26cb0 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
26cc0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f     /* aSpace1 */
26cf0 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
26d00 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
26d10 73 20 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20  s : 0);         
26d20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a      /* aFrom */.
26d30 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
26d40 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
26d50 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
26d60 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
26d70 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
26d80 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
26d90 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
26da0 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
26db0 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
26dc0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43  nMaxCells];.  aC
26dd0 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73  opy[0] = (u8*)&s
26de0 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
26df0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43  ;.  assert( ((aC
26e00 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70  opy[0] - (u8*)ap
26e10 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
26e20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
26e30 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
26e40 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42  .  for(i=1; i<NB
26e50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70  ; i++){.    aCop
26e60 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d  y[i] = &aCopy[i-
26e70 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1][pBt->pageSize
26e80 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d  +ROUND8(sizeof(M
26e90 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61  emPage))];.    a
26ea0 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69  ssert( ((aCopy[i
26eb0 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  ] - (u8*)apCell)
26ec0 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
26ed0 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
26ee0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a  required */.  }.
26ef0 20 20 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f    aSpace1 = &aCo
26f00 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61  py[NB-1][pBt->pa
26f10 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
26f20 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
26f30 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53 70  .  assert( ((aSp
26f40 61 63 65 31 20 2d 20 28 75 38 2a 29 61 70 43 65  ace1 - (u8*)apCe
26f50 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
26f60 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
26f70 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
26f80 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
26f90 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d  M ){.    aFrom =
26fa0 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70   &aSpace1[pBt->p
26fb0 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20  ageSize];.  }.  
26fc0 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74 65  aSpace2 = sqlite
26fd0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d  3PageMalloc(pBt-
26fe0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
26ff0 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a  ( aSpace2==0 ){.
27000 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27010 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
27020 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27030 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
27040 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
27050 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
27060 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
27070 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
27080 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
27090 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
270a0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
270b0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
270c0 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
270d0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
270e0 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
270f0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
27100 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
27110 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
27120 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
27130 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
27140 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
27150 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
27160 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
27170 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20  age*)aCopy[i];. 
27180 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f     memcpy(p, apO
27190 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
271a0 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e  mPage));.    p->
271b0 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  aData = (void*)&
271c0 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  p[1];.    memcpy
271d0 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  (p->aData, apOld
271e0 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
271f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
27200 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
27210 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
27220 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
27230 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
27240 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
27250 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
27260 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
27270 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
27280 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
27290 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
272a0 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d  ce obtained form
272b0 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
272c0 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
272d0 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
272e0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
272f0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
27300 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
27310 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
27320 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
27330 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
27340 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
27350 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
27360 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
27370 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
27380 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
27390 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
273a0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
273b0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
273c0 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
273d0 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
273e0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
273f0 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
27400 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
27410 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
27420 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
27430 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
27440 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
27450 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
27460 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
27470 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
27480 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
27490 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
274a0 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
274b0 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
274c0 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
274d0 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
274e0 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
274f0 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
27500 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c    nCell = 0;.  l
27510 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
27520 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20  pPage->leaf*4;. 
27530 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61 67   leafData = pPag
27540 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f  e->hasData;.  fo
27550 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
27560 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
27570 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
27580 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  i];.    int limi
27590 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
275a0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
275b0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
275c0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
275d0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
275e0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
275f0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
27600 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
27610 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
27620 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
27630 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
27640 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
27650 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  ell]);.      if(
27660 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
27670 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a  .        int a;.
27680 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
27690 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  ell] = i;.      
276a0 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c    for(a=0; a<pOl
276b0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b  d->nOverflow; a+
276c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
276d0 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d  ( pOld->aOvfl[a]
276e0 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e  .pCell==apCell[n
276f0 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  Cell] ){.       
27700 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
27710 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
27720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27740 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
27750 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
27760 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
27770 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   ){.      u16 sz
27780 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
27790 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
277a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  );.      if( lea
277b0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
277c0 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41   /* With the LEA
277d0 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72  FDATA flag, pPar
277e0 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f  ent cells hold o
277f0 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74  nly INTKEYs that
27800 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
27810 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65  duplicates of ke
27820 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20  ys on the child 
27830 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20  pages.  We need 
27840 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20  to remove.      
27850 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72    ** the divider
27860 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72   cells from pPar
27870 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76  ent, but the div
27880 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20  iders cells are 
27890 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
278a0 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d  dded to apCell[]
278b0 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72   because they ar
278c0 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
278d0 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20  child cells..   
278e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
278f0 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
27900 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
27910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27920 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
27930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
27940 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
27950 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
27960 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
27970 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
27980 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a  pace1[iSpace1];.
27990 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31 20          iSpace1 
279a0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
279b0 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
279c0 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
279d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
279e0 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65  pace1<=pBt->page
279f0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
27a00 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
27a10 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
27a20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
27a30 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
27a40 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
27a50 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
27a60 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UUM ){.         
27a70 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
27a80 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a  0xFF;.        }.
27a90 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
27aa0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
27ab0 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a   sz);.        sz
27ac0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c  Cell[nCell] -= l
27ad0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
27ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67         assert( g
27af0 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d  et4byte(pTemp)==
27b00 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20  pgnoOld[i] );.  
27b10 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
27b20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
27b30 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
27b40 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
27b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27b60 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
27b70 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
27b80 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
27b90 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20  e left.         
27ba0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
27bb0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
27bc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
27bd0 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
27be0 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
27bf0 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  pOld->hdrOffset+
27c00 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  8], 4);.        
27c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27c20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
27c30 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
27c40 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
27c50 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20  ll[nCell]<4 ){. 
27c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
27c70 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
27c80 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
27c90 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
27ca0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
27cb0 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
27cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27cd0 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c   }.        nCell
27ce0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
27cf0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
27d00 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
27d10 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
27d20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
27d30 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
27d40 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
27d50 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
27d60 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
27d70 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
27d80 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
27d90 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
27da0 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
27db0 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
27dc0 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
27dd0 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
27de0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
27df0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
27e00 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
27e10 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
27e20 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
27e30 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
27e40 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
27e50 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
27e60 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
27e70 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
27e80 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
27e90 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
27ea0 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
27eb0 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
27ec0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
27ed0 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
27ee0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
27ef0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
27f00 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
27f10 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
27f20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
27f30 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
27f40 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
27f50 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
27f60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
27f70 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
27f80 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
27f90 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
27fa0 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
27fb0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
27fc0 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
27fd0 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
27fe0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
27ff0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
28000 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
28010 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
28020 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
28030 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
28040 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
28050 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
28060 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
28070 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
28080 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
28090 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
280a0 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
280b0 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
280c0 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
280d0 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
280e0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
280f0 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
28100 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
28110 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
28120 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
28130 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
28140 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
28150 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
28160 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
28170 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
28180 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
28190 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
281a0 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
281b0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
281c0 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
281d0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
281e0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
281f0 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
28200 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
28210 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
28220 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
28230 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
28240 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
28250 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
28260 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
28270 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
28280 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
28290 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
282a0 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
282b0 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
282c0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
282d0 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
282e0 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
282f0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
28300 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
28310 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
28320 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
28330 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
28340 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
28350 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
28360 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
28370 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
28380 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
28390 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
283a0 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
283b0 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283d0 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
283e0 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
283f0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
28400 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
28410 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
28420 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
28430 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
28440 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
28450 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
28460 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
28470 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
28480 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
28490 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
284a0 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
284b0 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
284c0 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
284d0 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
284e0 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
284f0 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
28500 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
28510 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
28520 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
28530 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
28540 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
28550 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
28560 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
28570 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
28580 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
28590 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
285a0 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
285b0 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
285c0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
285d0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
285e0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
285f0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61  w[0])>0) or we a
28600 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69  re the.  ** a vi
28610 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
28620 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
28630 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
28640 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
28650 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
28660 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
28670 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
28680 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
28690 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
286a0 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
286b0 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
286c0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
286d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
286e0 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
286f0 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
28700 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
28710 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
28720 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
28730 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d  );.  pageFlags =
28740 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
28750 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
28760 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
28770 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
28780 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
28790 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
287a0 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
287b0 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
287c0 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20  = pgnoOld[i];.  
287d0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
287e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
287f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28800 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
28810 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
28820 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
28830 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
28840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28850 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
28860 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
28870 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
28880 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
28890 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b  New[i], pgnoNew[
288a0 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  i-1], 0);.      
288b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
288c0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
288d0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
288e0 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
288f0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
28900 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
28910 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
28920 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
28930 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
28940 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
28950 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
28960 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
28970 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
28980 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
28990 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
289a0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
289b0 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
289c0 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
289d0 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
289e0 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
289f0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
28a00 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
28a10 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
28a20 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
28a30 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
28a40 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
28a50 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
28a60 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
28a70 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
28a80 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
28a90 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
28aa0 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
28ab0 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
28ac0 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
28ad0 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
28ae0 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
28af0 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
28b00 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
28b10 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
28b20 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
28b30 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
28b40 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
28b50 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
28b60 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
28b70 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
28b80 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
28b90 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
28ba0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
28bb0 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
28bc0 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
28bd0 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
28be0 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
28bf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
28c00 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
28c10 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b  nV = pgnoNew[i];
28c20 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
28c30 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
28c40 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
28c50 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a     if( pgnoNew[j
28c60 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  ]<(unsigned)minV
28c70 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
28c80 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
28c90 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b  nV = pgnoNew[j];
28ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28cb0 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
28cc0 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20  .      int t;.  
28cd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
28ce0 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e  .      t = pgnoN
28cf0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20  ew[i];.      pT 
28d00 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
28d10 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
28d20 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20  gnoNew[minI];.  
28d30 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
28d40 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
28d50 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20    pgnoNew[minI] 
28d60 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  = t;.      apNew
28d70 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
28d80 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
28d90 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
28da0 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64  d %d %d  new: %d
28db0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
28dc0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
28dd0 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64  \n",.    pgnoOld
28de0 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  [0], .    nOld>=
28df0 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a  2 ? pgnoOld[1] :
28e00 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
28e10 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30  ? pgnoOld[2] : 0
28e20 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d  ,.    pgnoNew[0]
28e30 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20  , szNew[0],.    
28e40 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65  nNew>=2 ? pgnoNe
28e50 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[1] : 0, nNew>=
28e60 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30  2 ? szNew[1] : 0
28e70 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20  ,.    nNew>=3 ? 
28e80 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20  pgnoNew[2] : 0, 
28e90 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
28ea0 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
28eb0 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d  >=4 ? pgnoNew[3]
28ec0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
28ed0 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
28ee0 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f    nNew>=5 ? pgno
28ef0 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[4] : 0, nNew
28f00 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a  >=5 ? szNew[4] :
28f10 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   0));..  /*.  **
28f20 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
28f30 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
28f40 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
28f50 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
28f60 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
28f70 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
28f80 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
28f90 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
28fa0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
28fb0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
28fc0 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
28fd0 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
28fe0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
28ff0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
29000 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
29010 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
29020 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67  assert( pNew->pg
29030 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29  no==pgnoNew[i] )
29040 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
29050 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
29060 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
29070 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
29080 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
29090 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
290a0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
290b0 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
290c0 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
290d0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
290e0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
290f0 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  low==0 );..    /
29100 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
29110 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
29120 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
29130 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
29140 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  ries.    ** that
29150 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69   point to the si
29160 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
29170 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65   rearranged. The
29180 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a  se can be: left.
29190 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20      ** children 
291a0 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69  of cells, the ri
291b0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65  ght-child of the
291c0 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c   page, or overfl
291d0 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ow pages.    ** 
291e0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65  pointed to by ce
291f0 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lls..    */.    
29200 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
29210 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
29220 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
29230 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
29240 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
29250 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
29260 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
29270 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
29280 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
29290 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
292a0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
292b0 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
292c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
292d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
292e0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
292f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29300 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29310 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61  (pBt, get4byte(a
29320 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41  pCell[k]), PTRMA
29330 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
29340 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
29350 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
29360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29370 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29380 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29390 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
293a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
293b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20  .    }..    j = 
293c0 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
293d0 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
293e0 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
293f0 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
29400 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
29410 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
29420 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
29430 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
29440 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
29450 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d  .    if( i<nNew-
29460 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a  1 && j<nCell ){.
29470 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
29480 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
29490 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
294a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
294b0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
294c0 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
294d0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
294e0 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
294f0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
29500 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
29510 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20  ace2[iSpace2];. 
29520 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
29530 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
29540 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
29550 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
29560 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
29570 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20 20  SAUTOVACUUM .   
29580 20 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d 5b        && (aFrom[
29590 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  j]==0xFF || apCo
295a0 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67  py[aFrom[j]]->pg
295b0 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a  no!=pNew->pgno).
295c0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
295d0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
295e0 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
295f0 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50  e(pCell), PTRMAP
29600 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
29610 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  no);.          i
29620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29640 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
29650 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20  anup;.          
29660 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29670 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
29680 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
29690 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
296a0 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
296b0 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
296c0 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
296d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
296e0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
296f0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
29700 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
29710 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
29720 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
29730 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
29740 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
29750 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
29760 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
29770 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
29780 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
29790 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
297a0 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
297b0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
297c0 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73    j--;.        s
297d0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
297e0 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
297f0 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
29800 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
29810 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
29820 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
29830 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e  nt, pCell, 0, in
29840 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30  fo.nKey, 0, 0, 0
29850 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  , &sz);.        
29860 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
29870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29880 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
29890 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63      /* Obscure c
298a0 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66  ase for non-leaf
298b0 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20  -data trees: If 
298c0 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c  the cell at pCel
298d0 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a  l was.        **
298e0 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72   previously stor
298f0 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64  ed on a leaf nod
29900 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72  e, and its repor
29910 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20  ted size was 4. 
29920 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c         ** bytes,
29930 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74   then it may act
29940 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72  ually be smaller
29950 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20   than this .    
29960 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69      ** (see sqli
29970 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
29980 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20  lPtr(), 4 bytes 
29990 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73  is the minimum s
299a0 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ize of.        *
299b0 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74  * any cell). But
299c0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
299d0 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72   to pass the cor
299e0 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20  rect size to .  
299f0 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43        ** insertC
29a00 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73  ell(), so repars
29a10 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a  e the cell now..
29a20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
29a30 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
29a40 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68  this can never h
29a50 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69  appen in an SQLi
29a60 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73  te data file, as
29a70 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
29a80 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61  cells are at lea
29a90 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f  st 4 bytes. It o
29aa0 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62  nly happens in b
29ab0 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20  -trees used.    
29ac0 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61      ** to evalua
29ad0 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e  te "IN (SELECT .
29ae0 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72  ..)" and similar
29af0 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
29b00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
29b10 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b   szCell[j]==4 ){
29b20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
29b30 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t(leafCorrection
29b40 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==4);.          
29b50 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
29b60 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29  (pParent, pCell)
29b70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29b80 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61 63 65    }.      iSpace
29b90 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  2 += sz;.      a
29ba0 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
29bb0 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
29bc0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
29bd0 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce2<=pBt->pageSi
29be0 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ze );.      rc =
29bf0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
29c00 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
29c10 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29  l, sz, pTemp, 4)
29c20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
29c30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
29c40 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
29c50 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
29c60 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
29c70 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29  l(pParent,nxDiv)
29c80 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a  , pNew->pgno);..
29c90 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
29ca0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
29cb0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
29cc0 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
29cd0 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
29ce0 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
29cf0 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
29d00 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
29d10 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
29d20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
29d30 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
29d40 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
29d50 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
29d60 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
29d70 54 4f 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61  TOVACUUM && !lea
29d80 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
29d90 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
29da0 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  vfl(pParent, nxD
29db0 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  iv);.        if(
29dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
29de0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
29df0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29e00 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20    }.      j++;. 
29e10 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
29e20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
29e30 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
29e40 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
29e50 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
29e60 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
29e70 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
29e80 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
29e90 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  pBt, pNew->pgno,
29ea0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
29eb0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
29ec0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29ed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29ee0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
29ef0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a  leanup;.      }.
29f00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
29f10 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
29f20 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
29f30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
29f40 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
29f50 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
29f60 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
29f70 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
29f80 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
29f90 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
29fa0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
29fb0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
29fc0 6c 64 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20  ld, 4);.    if( 
29fd0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
29fe0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29ff0 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2a000 74 65 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d  te(zChild), PTRM
2a010 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
2a020 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
2a030 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a050 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2a060 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d  cleanup;.      }
2a070 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2a080 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d   nxDiv==pParent-
2a090 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e  >nCell+pParent->
2a0a0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
2a0b0 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
2a0c0 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69  ibling is the ri
2a0d0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ght-most child o
2a0e0 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20  f pParent */.   
2a0f0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
2a100 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2a110 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
2a120 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
2a130 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a140 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
2a150 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66  bling is the lef
2a160 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66  t child of the f
2a170 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50  irst entry in pP
2a180 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73  arent.    ** pas
2a190 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
2a1a0 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a   divider entry *
2a1b0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66  /.    put4byte(f
2a1c0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2a1d0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c  pParent, nxDiv),
2a1e0 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
2a1f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
2a200 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61  * Balance the pa
2a210 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65  rent page.  Note
2a220 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65 6e   that the curren
2a230 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20 6d  t page (pPage) m
2a240 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62  ight.  ** have b
2a250 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  een added to the
2a260 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20   freelist so it 
2a270 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  might no longer 
2a280 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
2a290 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72    ** But the par
2a2a0 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c  ent page will al
2a2b0 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69  ways be initiali
2a2c0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  zed..  */.  asse
2a2d0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
2a2e0 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  nit );.  sqlite3
2a2f0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
2a300 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ll);.  apCell = 
2a310 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
2a320 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d  (pPage);.  pCur-
2a330 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20 3d  >iPage--;.  rc =
2a340 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30   balance(pCur, 0
2a350 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  );.  .  /*.  ** 
2a360 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
2a370 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
2a380 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
2a390 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
2a3a0 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73 71  e(aSpace2);.  sq
2a3b0 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
2a3c0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
2a3d0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
2a3e0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2a3f0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2a400 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
2a410 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
2a420 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
2a430 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  [i]);.  }..  /* 
2a440 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72  releasePage(pPar
2a450 65 6e 74 29 3b 20 2a 2f 0a 20 20 54 52 41 43 45  ent); */.  TRACE
2a460 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
2a470 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
2a480 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
2a490 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
2a4a0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
2a4b0 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
2a4c0 6c 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  l));..  return r
2a4d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2a4e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a4f0 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
2a500 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
2a510 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
2a520 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2a530 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
2a540 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
2a550 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
2a560 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
2a570 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
2a580 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2a590 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42 74 43  ce_shallower(BtC
2a5a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2a5b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a5d0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 42 2d 54  Root page of B-T
2a5e0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2a5f0 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20   *pChild;       
2a600 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
2a610 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20  y child page of 
2a620 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  pPage */.  Pgno 
2a630 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20  pgnoChild;      
2a640 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2a650 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c  number for pChil
2a660 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
2a670 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2a680 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a690 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  de from subproce
2a6a0 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61  dures */.  BtSha
2a6b0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2a6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a6d0 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72  e main BTree str
2a6e0 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
2a6f0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20  mxCellPerPage;  
2a700 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2a710 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  mum number of ce
2a720 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a  lls per page */.
2a730 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a750 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d  * All cells from
2a760 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
2a770 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
2a780 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
2a790 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
2a7a0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2a7b0 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ls */..  assert(
2a7c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2a7d0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2a7e0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20  r->apPage[0];.. 
2a7f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a800 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2a810 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a820 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2a830 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a840 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2a850 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61  t;.  mxCellPerPa
2a860 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74  ge = MX_CELL(pBt
2a870 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  );.  apCell = sq
2a880 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43  lite3Malloc( mxC
2a890 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65  ellPerPage*(size
2a8a0 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75  of(u8*)+sizeof(u
2a8b0 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70  16)) );.  if( ap
2a8c0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
2a8d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2a8e0 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2a8f0 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65  &apCell[mxCellPe
2a900 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50  rPage];.  if( pP
2a910 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2a920 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73   /* The table is
2a930 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
2a940 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28  y */.    TRACE((
2a950 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20  "BALANCE: empty 
2a960 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61  table %d\n", pPa
2a970 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
2a980 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
2a990 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2a9a0 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63  ty but has one c
2a9b0 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20  hild.  Transfer 
2a9c0 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  the.    ** infor
2a9d0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
2a9e0 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
2a9f0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
2aa00 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
2aa10 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
2aa20 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
2aa30 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
2aa40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2aa50 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
2aa60 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68   is page 1, it h
2aa70 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76  as less space av
2aa80 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20  ailable than.   
2aa90 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
2aaa0 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
2aab0 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
2aac0 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
2aad0 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
2aae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c   the database fl
2aaf0 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20  e), so it might 
2ab00 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  not be able to h
2ab10 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a  old all of the .
2ab20 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
2ab30 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  on currently con
2ab40 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68  tained in the ch
2ab50 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73  ild.  If this is
2ab60 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73   the .    ** cas
2ab70 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  e, then do not d
2ab80 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20  o the transfer. 
2ab90 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d   Leave page 1 em
2aba0 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a  pty except.    *
2abb0 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
2abc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
2abd0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2abe0 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
2abf0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69  es.    ** the vi
2ac00 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
2ac10 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  e tree..    */. 
2ac20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75     VVA_ONLY( pCu
2ac30 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64  r->pagesShuffled
2ac40 20 3d 20 31 20 29 3b 0a 20 20 20 20 70 67 6e 6f   = 1 );.    pgno
2ac50 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2ac60 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2ac70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2ac80 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
2ac90 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a   pgnoChild>0 );.
2aca0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2acb0 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65  Child<=pagerPage
2acc0 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74  count(pPage->pBt
2acd0 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  ->pPager) );.   
2ace0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2acf0 65 65 47 65 74 50 61 67 65 28 70 50 61 67 65 2d  eeGetPage(pPage-
2ad00 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  >pBt, pgnoChild,
2ad10 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20   &pChild, 0);.  
2ad20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2ad30 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2ad40 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  nce;.    if( pPa
2ad50 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  ge->pgno==1 ){. 
2ad60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ad70 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2ad80 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 69 66  Child);.      if
2ad90 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2ada0 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2adb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2adc0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2add0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2ade0 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d   pChild->nFree>=
2adf0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  100 ){.        /
2ae00 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f  * The child info
2ae10 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74  rmation will fit
2ae20 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
2ae30 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20  e, so do the.   
2ae40 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a       ** copy */.
2ae50 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
2ae60 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28         zeroPage(
2ae70 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61  pPage, pChild->a
2ae80 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
2ae90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68    for(i=0; i<pCh
2aea0 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  ild->nCell; i++)
2aeb0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65  {.          apCe
2aec0 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  ll[i] = findCell
2aed0 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20  (pChild,i);.    
2aee0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20        szCell[i] 
2aef0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43  = cellSizePtr(pC
2af00 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29  hild, apCell[i])
2af10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2af20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2af30 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2af40 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73  nCell, apCell, s
2af50 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  zCell);.        
2af60 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68  /* Copy the righ
2af70 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t-pointer of the
2af80 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61   child to the pa
2af90 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rent. */.       
2afa0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2afb0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2afc0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20  drOffset+8], .  
2afd0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
2afe0 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61 74  te(&pChild->aDat
2aff0 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66  a[pChild->hdrOff
2b000 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2b010 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2b020 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  d);.        TRAC
2b030 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2b040 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74  ld %d transfer t
2b050 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68  o page 1\n", pCh
2b060 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ild->pgno));.   
2b070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b080 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68    /* The child h
2b090 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74  as more informat
2b0a0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ion that will fi
2b0b0 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20  t on the root.. 
2b0c0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72         ** The tr
2b0d0 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61  ee is already ba
2b0e0 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68  lanced.  Do noth
2b0f0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ing. */.        
2b100 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2b110 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e   child %d will n
2b120 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31  ot fit on page 1
2b130 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  \n", pChild->pgn
2b140 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o));.      }.   
2b150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2b160 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74  mcpy(pPage->aDat
2b170 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  a, pChild->aData
2b180 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
2b190 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
2b1a0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2b1b0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
2b1c0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2b1d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2b1e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2b1f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2b200 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64   freePage(pChild
2b210 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  );.      TRACE((
2b220 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66  "BALANCE: transf
2b230 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f  er child %d into
2b240 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20   root %d\n",.   
2b250 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c             pChil
2b260 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e  d->pgno, pPage->
2b270 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
2b280 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b290 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2b2a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b2b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b2c0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2b2d0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
2b2e0 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
2b2f0 70 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ps(pPage);.    }
2b300 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65  .#endif.    rele
2b310 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
2b320 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77  .  }.end_shallow
2b330 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69  _balance:.  sqli
2b340 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29  te3_free(apCell)
2b350 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2b360 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f  .../*.** The roo
2b370 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  t page is overfu
2b380 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ll.**.** When th
2b390 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61  is happens, Crea
2b3a0 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  te a new child p
2b3b0 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65  age and copy the
2b3c0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
2b3d0 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68  the root into th
2b3e0 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d  e child.  Then m
2b3f0 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  ake the root.** 
2b400 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61  page an empty pa
2b410 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69  ge with rightChi
2b420 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ld pointing to t
2b430 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e  he new.** child.
2b440 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c     Finally, call
2b450 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61   balance_interna
2b460 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63  l() on the new c
2b470 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65  hild.** to cause
2b480 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f   it to split..*/
2b490 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2b4a0 6e 63 65 5f 64 65 65 70 65 72 28 42 74 43 75 72  nce_deeper(BtCur
2b4b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2b4c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2b4d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
2b4e0 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
2b4f0 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ures */.  MemPag
2b500 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 2f 2a  e *pPage;     /*
2b510 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
2b520 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 4d  root page */.  M
2b530 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
2b540 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2b550 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
2b560 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2b570 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61  Child;     /* Pa
2b580 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2b590 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2b5a0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
2b5b0 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt;         /* T
2b5c0 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e  he BTree */.  in
2b5d0 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
2b5e0 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c    /* Total usabl
2b5f0 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
2b600 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
2b610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2b620 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65  tent of the pare
2b630 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  nt page */.  u8 
2b640 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20  *cdata;         
2b650 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
2b660 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  he child page */
2b670 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
2b680 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2b690 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
2b6a0 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69  in parent */.  i
2b6b0 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
2b6c0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2b6d0 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74  content of first
2b6e0 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20   cell in parent 
2b6f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
2b700 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a  ur->iPage==0 );.
2b710 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b720 61 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72  apPage[0]->nOver
2b730 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 56 56 41  flow>0 );..  VVA
2b740 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
2b750 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29  esShuffled = 1 )
2b760 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2b770 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 70  ->apPage[0];.  p
2b780 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2b790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b7a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2b7b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
2b7c0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2b7d0 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69  ePage(pBt, &pChi
2b7e0 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20  ld, &pgnoChild, 
2b7f0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b  pPage->pgno, 0);
2b800 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2b810 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
2b820 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b830 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
2b840 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75  >pDbPage) );.  u
2b850 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
2b860 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
2b870 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2b880 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
2b890 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2b8a0 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28  cbrk = get2byte(
2b8b0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
2b8c0 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d   cdata = pChild-
2b8d0 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79  >aData;.  memcpy
2b8e0 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64  (cdata, &data[hd
2b8f0 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r], pPage->cellO
2b900 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
2b910 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d  Cell-hdr);.  mem
2b920 63 70 79 28 26 63 64 61 74 61 5b 63 62 72 6b 5d  cpy(&cdata[cbrk]
2b930 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
2b940 73 61 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b  sableSize-cbrk);
2b950 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
2b960 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2b970 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28 20 72  pChild);.  if( r
2b980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b990 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
2b9a0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b9b0 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  *sizeof(pPage->a
2b9c0 4f 76 66 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d 65  Ovfl[0]);.    me
2b9d0 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
2b9e0 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  fl, pPage->aOvfl
2b9f0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70 43  , nCopy);.    pC
2ba00 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2ba10 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2ba20 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 43 68 69  ow;.    if( pChi
2ba30 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
2ba40 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e  .      pChild->n
2ba50 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Free = 0;.    }.
2ba60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69      assert( pChi
2ba70 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65  ld->nCell==pPage
2ba80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7a  ->nCell );.    z
2ba90 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
2baa0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
2bab0 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
2bac0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2bad0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2bae0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
2baf0 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 54 52  noChild);.    TR
2bb00 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2bb10 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
2bb20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2bb30 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
2bb40 6f 29 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41  o));.    if( ISA
2bb50 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2bb60 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2bb70 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70  t(pBt, pChild->p
2bb80 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2bb90 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  E, pPage->pgno);
2bba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bbb0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2bbc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2bbd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bbe0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
2bbf0 50 74 72 6d 61 70 73 28 70 43 68 69 6c 64 29 3b  Ptrmaps(pChild);
2bc00 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2bc10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2bc20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bc30 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  {.    pCur->iPag
2bc40 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  e++;.    pCur->a
2bc50 70 50 61 67 65 5b 31 5d 20 3d 20 70 43 68 69 6c  pPage[1] = pChil
2bc60 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  d;.    pCur->aiI
2bc70 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72  dx[0] = 0;.    r
2bc80 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
2bc90 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  oot(pCur);.  }el
2bca0 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
2bcb0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d  age(pChild);.  }
2bcc0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2bcd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
2bce0 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65   that pCur curre
2bcf0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68  ntly points to h
2bd00 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64  as just been mod
2bd10 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65  ified in.** some
2bd20 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74   way. This funct
2bd30 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20  ion figures out 
2bd40 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61  if this modifica
2bd50 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a  tion means the.*
2bd60 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  * tree needs to 
2bd70 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64  be balanced, and
2bd80 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65   if so calls the
2bd90 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
2bda0 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69  ancing .** routi
2bdb0 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61 6d  ne..** .** Param
2bdc0 65 74 65 72 20 69 73 49 6e 73 65 72 74 20 69 73  eter isInsert is
2bdd0 20 74 72 75 65 20 69 66 20 61 20 6e 65 77 20 63   true if a new c
2bde0 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e 73  ell was just ins
2bdf0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 0a 2a  erted into the.*
2be00 2a 20 70 61 67 65 2c 20 6f 72 20 66 61 6c 73 65  * page, or false
2be10 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
2be20 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2be30 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
2be40 2c 20 69 6e 74 20 69 73 49 6e 73 65 72 74 29 7b  , int isInsert){
2be50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2be60 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2be70 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2be80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2be90 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge];..  assert( 
2bea0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2beb0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2bec0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
2bed0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2bee0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2bef0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2bf00 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2bf10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bf20 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
2bf30 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
2bf40 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
2bf50 65 65 70 65 72 28 70 43 75 72 29 3b 0a 20 20 20  eeper(pCur);.   
2bf60 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2bf70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2bf80 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
2bf90 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2bfa0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 43 75 72  e_shallower(pCur
2bfb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2bfc0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
2bfd0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  >nOverflow>0 || 
2bfe0 0a 20 20 20 20 20 20 20 20 28 21 69 73 49 6e 73  .        (!isIns
2bff0 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ert && pPage->nF
2c000 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ree>pPage->pBt->
2c010 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20  usableSize*2/3) 
2c020 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2c030 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43  lance_nonroot(pC
2c040 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
2c050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c060 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2c070 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72  e checks all cur
2c080 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20  sors that point 
2c090 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f  to table pgnoRoo
2c0a0 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  t..** If any of 
2c0b0 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65  those cursors we
2c0c0 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  re opened with w
2c0d0 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69  rFlag==0 in a di
2c0e0 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62  fferent.** datab
2c0f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28  ase connection (
2c100 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2c110 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65  ction that share
2c120 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  s the pager.** c
2c130 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63 75  ache with the cu
2c140 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  rrent connection
2c150 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72  ) and that other
2c160 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
2c170 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65  is not in the Re
2c180 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73  adUncommmitted s
2c190 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20  tate, then this 
2c1a0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2c1b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .** SQLITE_LOCKE
2c1c0 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c  D..**.** As well
2c1d0 20 61 73 20 63 75 72 73 6f 72 73 20 77 69 74 68   as cursors with
2c1e0 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73   wrFlag==0, curs
2c1f0 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ors with wrFlag=
2c200 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73 49 6e 63  =1 and .** isInc
2c210 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61  rblobHandle==1 a
2c220 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72  re also consider
2c230 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f 72  ed 'read' cursor
2c240 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 0a  s. Incremental .
2c250 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ** blob cursors 
2c260 61 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f 74  are used for bot
2c270 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  h reading and wr
2c280 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  iting..**.** Whe
2c290 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  n pgnoRoot is th
2c2a0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
2c2b0 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n intkey table, 
2c2c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2c2d0 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73   also.** respons
2c2e0 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69 64  ible for invalid
2c2f0 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74 61  ating incrementa
2c300 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 77  l blob cursors w
2c310 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f  hen the table ro
2c320 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68  w.** on which th
2c330 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69 73  ey are opened is
2c340 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69   deleted or modi
2c350 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61 72  fied. Cursors ar
2c360 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
2c370 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2c380 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65  e following rule
2c390 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68  s:.**.**   1) Wh
2c3a0 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61 62  en BtreeClearTab
2c3b0 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  le() is called t
2c3c0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65 6c  o completely del
2c3d0 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ete the contents
2c3e0 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42 2d  .**      of a B-
2c3f0 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78 63  Tree table, pExc
2c400 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 7a  lude is set to z
2c410 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74 65  ero and paramete
2c420 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20 20  r iRow is .**   
2c430 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65     set to non-ze
2c440 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
2c450 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c   all incremental
2c460 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70   blob cursors op
2c470 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  en.**      on th
2c480 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
2c490 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20 69  t pgnoRoot are i
2c4a0 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a  nvalidated..**.*
2c4b0 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74 72 65  *   2) When Btre
2c4c0 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65 65  eInsert(), Btree
2c4d0 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
2c4e0 65 50 75 74 44 61 74 61 28 29 20 69 73 20 63 61  ePutData() is ca
2c4f0 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20 20  lled to .**     
2c500 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65 20   modify a table 
2c510 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20 73  row via an SQL s
2c520 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c 75  tatement, pExclu
2c530 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
2c540 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65 20   .**      write 
2c550 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 64  cursor used to d
2c560 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69  o the modificati
2c570 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72  on and parameter
2c580 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a 20   iRow is set.** 
2c590 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65       to the inte
2c5a0 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74 68  ger row id of th
2c5b0 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20 62  e B-Tree entry b
2c5c0 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 55  eing modified. U
2c5d0 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70 45  nless.**      pE
2c5e0 78 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c 66  xclude is itself
2c5f0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
2c600 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68 65  blob cursor, the
2c610 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61  n all incrementa
2c620 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20 63  l.**      blob c
2c630 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 72  ursors open on r
2c640 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20 42  ow iRow of the B
2c650 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c 69  -Tree are invali
2c660 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  dated..**.**   3
2c670 29 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c 75  ) If both pExclu
2c680 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65 20  de and iRow are 
2c690 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20  set to zero, no 
2c6a0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2c6b0 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f 72   .**      cursor
2c6c0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
2c6d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2c6e0 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2c6f0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
2c700 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  , .  Pgno pgnoRo
2c710 6f 74 2c 20 0a 20 20 42 74 43 75 72 73 6f 72 20  ot, .  BtCursor 
2c720 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20 69 36 34  *pExclude,.  i64
2c730 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74 43 75 72   iRow.){.  BtCur
2c740 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72  sor *p;.  BtShar
2c750 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65  ed *pBt = pBtree
2c760 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
2c770 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64   *db = pBtree->d
2c780 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
2c790 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
2c7a0 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
2c7b0 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
2c7c0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
2c7d0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xt){.    if( p==
2c7e0 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69  pExclude ) conti
2c7f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2c800 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f  pgnoRoot!=pgnoRo
2c810 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  ot ) continue;.#
2c820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c830 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
2c840 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f  if( p->isIncrblo
2c850 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20 20  bHandle && ( .  
2c860 20 20 20 20 20 20 20 28 21 70 45 78 63 6c 75 64         (!pExclud
2c870 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20 20  e && iRow).     
2c880 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26 26   || (pExclude &&
2c890 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e   !pExclude->isIn
2c8a0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
2c8b0 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
2c8c0 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  ow).    )){.    
2c8d0 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
2c8e0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2c8f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
2c900 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55  f( p->eState!=CU
2c910 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e  RSOR_VALID ) con
2c920 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2c930 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66  ->wrFlag==0 .#if
2c940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2c950 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c  _INCRBLOB.     |
2c960 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  | p->isIncrblobH
2c970 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20  andle.#endif.   
2c980 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2c990 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e  3 *dbOther = p->
2c9a0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
2c9b0 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30    if( dbOther==0
2c9c0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62   ||.         (db
2c9d0 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62  Other!=db && (db
2c9e0 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53  Other->flags & S
2c9f0 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2ca00 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  itted)==0) ){.  
2ca10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ca20 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
2ca30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ca40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ca50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2ca60 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
2ca70 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
2ca80 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
2ca90 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
2caa0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
2cab0 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
2cac0 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
2cad0 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
2cae0 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
2caf0 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
2cb00 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
2cb10 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
2cb20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
2cb30 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2cb40 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
2cb50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
2cb60 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
2cb70 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
2cb80 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
2cb90 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
2cba0 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
2cbb0 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
2cbc0 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
2cbd0 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
2cbe0 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e  h ignored..*/.in
2cbf0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
2cc00 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72  sert(.  BtCursor
2cc10 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2cc20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
2cc30 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74   data into the t
2cc40 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72  able of this cur
2cc50 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  sor */.  const v
2cc60 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
2cc70 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
2cc80 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ey of the new re
2cc90 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
2cca0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
2ccb0 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20   nData,  /* The 
2ccc0 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20  data of the new 
2ccd0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2cce0 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
2ccf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cd00 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20  mber of extra 0 
2cd10 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
2cd20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  to data */.  int
2cd30 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20 20   appendBias     
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2cd50 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c  rue if this is l
2cd60 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20  ikely an append 
2cd70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
2cd80 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74    int loc;.  int
2cd90 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64   szNew;.  int id
2cda0 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2cdb0 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  age;.  Btree *p 
2cdc0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
2cdd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2cde0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
2cdf0 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65  gned char *oldCe
2ce00 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ll;.  unsigned c
2ce10 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30  har *newCell = 0
2ce20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2ce30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2ce40 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ur) );.  if( pBt
2ce50 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2ce60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2ce70 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2ce80 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2ce90 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20  before doing an 
2cea0 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 63  insert */.    rc
2ceb0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2cec0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2ced0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2cee0 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2cef0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2cf00 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2cf10 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77  ;.  if( !pCur->w
2cf20 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rFlag ){.    ret
2cf30 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2cf40 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74     /* Cursor not
2cf50 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e   open for writin
2cf60 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63  g */.  }.  if( c
2cf70 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43  heckReadLocks(pC
2cf80 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72  ur->pBtree, pCur
2cf90 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2cfa0 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72  , nKey) ){.    r
2cfb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2cfc0 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2cfd0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2cfe0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2cff0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
2d000 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d010 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2d020 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2d030 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  p;.  }..  /* Sav
2d040 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
2d050 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
2d060 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
2d070 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  s table */.  sql
2d080 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
2d090 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 69 66  rsor(pCur);.  if
2d0a0 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
2d0b0 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
2d0c0 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2d0d0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2d0e0 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
2d0f0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
2d100 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2d110 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
2d120 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
2d130 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
2d140 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50  rn rc;.  }..  pP
2d150 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d160 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d170 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d180 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
2d190 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
2d1a0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
2d1b0 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
2d1c0 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45  ;.  TRACE(("INSE
2d1d0 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65  RT: table=%d nke
2d1e0 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20  y=%lld ndata=%d 
2d1f0 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  page=%d %s\n",. 
2d200 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
2d210 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e  gnoRoot, nKey, n
2d220 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Data, pPage->pgn
2d230 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63  o,.          loc
2d240 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65  ==0 ? "overwrite
2d250 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29  " : "new entry")
2d260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2d270 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2d280 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
2d290 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c  e(pBt);.  newCel
2d2a0 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  l = pBt->pTmpSpa
2d2b0 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c  ce;.  if( newCel
2d2c0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2d2d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
2d2e0 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
2d2f0 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b  age, newCell, pK
2d300 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c  ey, nKey, pData,
2d310 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26   nData, nZero, &
2d320 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63  szNew);.  if( rc
2d330 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
2d340 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  rt;.  assert( sz
2d350 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  New==cellSizePtr
2d360 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29  (pPage, newCell)
2d370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
2d380 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a  New<=MX_CELL_SIZ
2d390 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20  E(pBt) );.  idx 
2d3a0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
2d3b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66  ur->iPage];.  if
2d3c0 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53  ( loc==0 && CURS
2d3d0 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2d3e0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 75 31  eState ){.    u1
2d3f0 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73  6 szOld;.    ass
2d400 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e  ert( idx<pPage->
2d410 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
2d420 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2d430 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2d440 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2d450 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
2d460 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a  d_insert;.    }.
2d470 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69      oldCell = fi
2d480 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2d490 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  x);.    if( !pPa
2d4a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d4b0 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c    memcpy(newCell
2d4c0 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20  , oldCell, 4);. 
2d4d0 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d     }.    szOld =
2d4e0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2d4f0 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
2d500 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2d510 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2d520 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2d530 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2d540 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2d550 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b  ge, idx, szOld);
2d560 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
2d570 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  <0 && pPage->nCe
2d580 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ll>0 ){.    asse
2d590 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2d5a0 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70  );.    idx = ++p
2d5b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d5c0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 70 43 75  >iPage];.    pCu
2d5d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2d5e0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
2d5f0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65  idNKey = 0;.  }e
2d600 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2d610 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2d620 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72    }.  rc = inser
2d630 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  tCell(pPage, idx
2d640 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
2d650 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2d660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2d670 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
2d680 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2d690 43 75 72 2c 20 31 29 3b 0a 20 20 69 66 28 20 72  Cur, 1);.  if( r
2d6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d6b0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2d6c0 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e  Cur);.  }.end_in
2d6d0 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
2d6e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2d6f0 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
2d700 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
2d710 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
2d720 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2d730 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2d740 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61  a arbitrary loca
2d750 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
2d760 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2d770 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2d780 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d790 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2d7a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2d7b0 20 69 6e 74 20 69 64 78 3b 0a 20 20 75 6e 73 69   int idx;.  unsi
2d7c0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2d7d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  ;.  int rc;.  Pg
2d7e0 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
2d7f0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
2d800 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
2d810 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2d820 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2d830 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2d840 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2d850 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2d860 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74  nit );.  if( pBt
2d870 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2d880 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2d890 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2d8a0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2d8b0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64  before doing a d
2d8c0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20  elete */.    rc 
2d8d0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2d8e0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2d8f0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2d900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2d910 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2d920 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2d930 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d940 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2d950 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2d960 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2d970 20 20 69 66 28 20 70 43 75 72 2d 3e 61 69 49 64    if( pCur->aiId
2d980 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
2d990 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2d9a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d9b0 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65  E_ERROR;  /* The
2d9c0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2d9d0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68  ointing to anyth
2d9e0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2d9f0 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2da00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2da10 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44  ITE_PERM;   /* D
2da20 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73  id not open this
2da30 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74   cursor for writ
2da40 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2da50 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2da60 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
2da70 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2da80 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ur, pCur->info.n
2da90 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Key) ){.    retu
2daa0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2dab0 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2dac0 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2dad0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2dae0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
2daf0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2db00 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28  ursor position (
2db10 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63  a no-op if the c
2db20 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2db30 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51  .  ** CURSOR_REQ
2db40 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20  UIRESEEK state) 
2db50 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73  and save the pos
2db60 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2db70 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a  her cursors .  *
2db80 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  * open on the sa
2db90 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63  me table. Then c
2dba0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2dbb0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70  Write() on the p
2dbc0 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  age.  ** that th
2dbd0 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20  e entry will be 
2dbe0 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20  deleted from..  
2dbf0 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72  */.  if( .    (r
2dc00 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2dc10 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29  rPosition(pCur))
2dc20 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
2dc30 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2dc40 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2dc50 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c  oot, pCur))!=0 |
2dc60 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69  |.    (rc = sqli
2dc70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2dc80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
2dc90 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
2dca0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
2dcb0 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20  Locate the cell 
2dcc0 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65 20  within its page 
2dcd0 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20  and leave pCell 
2dce0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a  pointing to the.
2dcf0 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63    ** data. The c
2dd00 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20  learCell() call 
2dd10 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c  frees any overfl
2dd20 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
2dd30 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
2dd40 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c  * cell. The cell
2dd50 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c   itself is still
2dd60 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20   intact..  */.  
2dd70 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
2dd80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
2dd90 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2dda0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  ll(pPage, idx);.
2ddb0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2ddc0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68  af ){.    pgnoCh
2ddd0 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70  ild = get4byte(p
2dde0 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20  Cell);.  }.  rc 
2ddf0 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
2de00 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28  e, pCell);.  if(
2de10 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
2de20 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
2de30 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2de40 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
2de50 68 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20  he entry we are 
2de60 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20  about to delete 
2de70 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f  is not a leaf so
2de80 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20   if we do not.  
2de90 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e    ** do somethin
2dea0 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20  g we will leave 
2deb0 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74  a hole on an int
2dec0 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20  ernal page..    
2ded0 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69  ** We have to fi
2dee0 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d  ll the hole by m
2def0 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20  oving in a cell 
2df00 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68  from a leaf.  Th
2df10 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65  e.    ** next Ce
2df20 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65  ll after the one
2df30 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
2df40 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2df50 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a  exist and.    **
2df60 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f   to be a leaf so
2df70 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a   we can use it..
2df80 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72      */.    BtCur
2df90 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20  sor leafCur;.   
2dfa0 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 50   MemPage *pLeafP
2dfb0 61 67 65 3b 0a 0a 20 20 20 20 75 6e 73 69 67 6e  age;..    unsign
2dfc0 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a  ed char *pNext;.
2dfd0 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b      int notUsed;
2dfe0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2dff0 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30  ar *tempCell = 0
2e000 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
2e010 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
2e020 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2e030 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43  GetTempCursor(pC
2e040 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20  ur, &leafCur);. 
2e050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e060 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75  treeNext(&leafCu
2e070 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
2e080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2e0a0 65 72 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49  ert( leafCur.aiI
2e0b0 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65  dx[leafCur.iPage
2e0c0 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c  ]==0 );.      pL
2e0d0 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75  eafPage = leafCu
2e0e0 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72  r.apPage[leafCur
2e0f0 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 72  .iPage];.      r
2e100 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e110 57 72 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d  Write(pLeafPage-
2e120 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
2e130 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e150 69 6e 74 20 6c 65 61 66 43 75 72 73 6f 72 49 6e  int leafCursorIn
2e160 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  valid = 0;.     
2e170 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20   u16 szNext;.   
2e180 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
2e190 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
2e1a0 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d  te internal from
2e1b0 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d   %d replace from
2e1c0 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2e1d0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2e1e0 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2e1f0 6f 2c 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67  o, pLeafPage->pg
2e200 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
2e210 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
2e220 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2e230 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2e240 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
2e250 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30  ell(pLeafPage, 0
2e260 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20  );.      szNext 
2e270 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c  = cellSizePtr(pL
2e280 65 61 66 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  eafPage, pNext);
2e290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2e2a0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2e2b0 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2e2c0 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
2e2d0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
2e2e0 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74    tempCell = pBt
2e2f0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
2e300 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d     if( tempCell=
2e310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2e320 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e340 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e350 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e360 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2e370 65 2c 20 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  e, idx, pNext-4,
2e380 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2e390 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ell, 0);.      }
2e3a0 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ...      /* The 
2e3b0 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69  "if" statement i
2e3c0 6e 20 74 68 65 20 6e 65 78 74 20 63 6f 64 65 20  n the next code 
2e3d0 62 6c 6f 63 6b 20 69 73 20 63 72 69 74 69 63 61  block is critica
2e3e0 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  l.  The.      **
2e3f0 20 73 6c 69 67 68 74 65 73 74 20 65 72 72 6f 72   slightest error
2e400 20 69 6e 20 74 68 61 74 20 73 74 61 74 65 6d 65   in that stateme
2e410 6e 74 20 77 6f 75 6c 64 20 61 6c 6c 6f 77 20 53  nt would allow S
2e420 51 4c 69 74 65 20 74 6f 20 6f 70 65 72 61 74 65  QLite to operate
2e430 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  .      ** correc
2e440 74 6c 79 20 6d 6f 73 74 20 6f 66 20 74 68 65 20  tly most of the 
2e450 74 69 6d 65 20 62 75 74 20 70 72 6f 64 75 63 65  time but produce
2e460 20 76 65 72 79 20 72 61 72 65 20 66 61 69 6c 75   very rare failu
2e470 72 65 73 2e 20 20 54 6f 0a 20 20 20 20 20 20 2a  res.  To.      *
2e480 2a 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  * guard against 
2e490 74 68 69 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  this, the follow
2e4a0 69 6e 67 20 6d 61 63 72 6f 73 20 68 65 6c 70 20  ing macros help 
2e4b0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 0a 20  to verify that. 
2e4c0 20 20 20 20 20 2a 2a 20 74 68 65 20 22 69 66 22       ** the "if"
2e4d0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 77 65   statement is we
2e4e0 6c 6c 20 74 65 73 74 65 64 2e 0a 20 20 20 20 20  ll tested..     
2e4f0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
2e500 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
2e510 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
2e520 2d 3e 6e 46 72 65 65 3c 70 42 74 2d 3e 75 73 61  ->nFree<pBt->usa
2e530 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20  bleSize*2/3 .   
2e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2e550 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
2e560 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
2e570 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
2e580 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
2e590 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
2e5a0 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
2e5b0 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
2e5c0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20  ableSize*2/3 .  
2e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2e5e0 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72  & pLeafPage->nFr
2e5f0 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42  ee+2+szNext > pB
2e600 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2e610 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  3 );.      testc
2e620 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ase( pPage->nOve
2e630 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67  rflow==0 && pPag
2e640 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75  e->nFree==pBt->u
2e650 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20  sableSize*2/3+1 
2e660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e670 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e    && pLeafPage->
2e680 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e  nFree+2+szNext >
2e690 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2e6a0 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65  *2/3 );.      te
2e6b0 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
2e6c0 4f 76 65 72 66 6c 6f 77 3e 30 20 26 26 20 70 50  Overflow>0 && pP
2e6d0 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 70 42 74 2d  age->nFree<=pBt-
2e6e0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 0a  >usableSize*2/3.
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e700 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
2e710 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20  Free+2+szNext > 
2e720 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
2e730 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73  2/3 );.      tes
2e740 74 63 61 73 65 28 20 28 70 50 61 67 65 2d 3e 6e  tcase( (pPage->n
2e750 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70  Overflow>0 || (p
2e760 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42  Page->nFree > pB
2e770 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
2e780 33 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  3)).            
2e790 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
2e7a0 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
2e7b0 74 20 3d 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  t == pBt->usable
2e7c0 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20  Size*2/3 );...  
2e7d0 20 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e      if( (pPage->
2e7e0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28  nOverflow>0 || (
2e7f0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70  pPage->nFree > p
2e800 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2e810 2f 33 29 29 20 26 26 0a 20 20 20 20 20 20 20 20  /3)) &&.        
2e820 20 20 28 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46    (pLeafPage->nF
2e830 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70  ree+2+szNext > p
2e840 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2e850 2f 33 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  /3).      ){.   
2e860 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2e870 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
2e880 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2e890 65 20 69 73 20 6e 6f 77 20 65 69 74 68 65 72 20  e is now either 
2e8a0 6f 76 65 72 66 6c 6f 77 69 6e 67 0a 20 20 20 20  overflowing.    
2e8b0 20 20 20 20 2a 2a 20 6f 72 20 75 6e 64 65 72 66      ** or underf
2e8c0 75 6c 6c 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ull and the leaf
2e8d0 20 6e 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 6e   node will be un
2e8e0 64 65 72 66 75 6c 6c 20 61 66 74 65 72 20 74 68  derfull after th
2e8f0 65 20 6a 75 73 74 20 63 65 6c 6c 20 0a 20 20 20  e just cell .   
2e900 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 74       ** copied t
2e910 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  o the internal n
2e920 6f 64 65 20 69 73 20 64 65 6c 65 74 65 64 20 66  ode is deleted f
2e930 72 6f 6d 20 69 74 2e 20 54 68 69 73 20 69 73 20  rom it. This is 
2e940 61 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20  a special.      
2e950 20 20 2a 2a 20 63 61 73 65 20 62 65 63 61 75 73    ** case becaus
2e960 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 61  e the call to ba
2e970 6c 61 6e 63 65 28 29 20 74 6f 20 63 6f 72 72 65  lance() to corre
2e980 63 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ct the internal 
2e990 6e 6f 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  node.        ** 
2e9a0 6d 61 79 20 63 68 61 6e 67 65 20 74 68 65 20 74  may change the t
2e9b0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
2e9c0 64 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  d invalidate the
2e9d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 20 20 20   contents of.   
2e9e0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66       ** the leaf
2e9f0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
2ea00 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
2ea10 20 61 72 72 61 79 73 2c 20 77 68 69 63 68 20 77   arrays, which w
2ea20 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
2ea30 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 62 61  * used by the ba
2ea40 6c 61 6e 63 65 28 29 20 72 65 71 75 69 72 65 64  lance() required
2ea50 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20   to correct the 
2ea60 75 6e 64 65 72 66 75 6c 6c 20 6c 65 61 66 0a 20  underfull leaf. 
2ea70 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a         ** node..
2ea80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2ea90 20 20 20 2a 2a 20 54 68 65 20 66 6f 72 6d 75 6c     ** The formul
2eaa0 61 20 75 73 65 64 20 69 6e 20 74 68 65 20 65 78  a used in the ex
2eab0 70 72 65 73 73 69 6f 6e 20 61 62 6f 76 65 20 61  pression above a
2eac0 72 65 20 62 61 73 65 64 20 6f 6e 20 66 61 63 65  re based on face
2ead0 74 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ts of.        **
2eae0 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
2eaf0 2d 66 6f 72 6d 61 74 20 74 68 61 74 20 64 6f 20  -format that do 
2eb00 6e 6f 74 20 63 68 61 6e 67 65 20 6f 76 65 72 20  not change over 
2eb10 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  time..        */
2eb20 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2eb30 65 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d  e( pPage->nFree=
2eb40 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2eb50 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20  *2/3+1 );.      
2eb60 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 61    testcase( pLea
2eb70 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73  fPage->nFree+2+s
2eb80 7a 4e 65 78 74 3d 3d 70 42 74 2d 3e 75 73 61 62  zNext==pBt->usab
2eb90 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a  leSize*2/3+1 );.
2eba0 20 20 20 20 20 20 20 20 6c 65 61 66 43 75 72 73          leafCurs
2ebb0 6f 72 49 6e 76 61 6c 69 64 20 3d 20 31 3b 0a 20  orInvalid = 1;. 
2ebc0 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 0a 0a       }        ..
2ebd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2ebe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ebf0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2ec00 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2ec10 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43 68  ge, idx), pgnoCh
2ec20 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 56 56  ild);.        VV
2ec30 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61  A_ONLY( pCur->pa
2ec40 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20  gesShuffled = 0 
2ec50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2ec60 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
2ec70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ec80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ec90 4f 4b 20 26 26 20 6c 65 61 66 43 75 72 73 6f 72  OK && leafCursor
2eca0 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  Invalid ){.     
2ecb0 20 20 20 2f 2a 20 54 68 65 20 6c 65 61 66 2d 6e     /* The leaf-n
2ecc0 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e 64 65 72  ode is now under
2ecd0 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68 65 20  full and so the 
2ece0 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65  tree needs to be
2ecf0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 62   .        ** reb
2ed00 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76 65 72  alanced. However
2ed10 2c 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  , the balance() 
2ed20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
2ed30 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
2ed40 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76 65 20    ** node above 
2ed50 6d 61 79 20 68 61 76 65 20 6d 6f 64 69 66 69 65  may have modifie
2ed60 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  d the structure 
2ed70 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 6e  of the B-Tree an
2ed80 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20  d.        ** so 
2ed90 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
2eda0 65 6e 74 73 20 6f 66 20 6c 65 61 66 43 75 72 2e  ents of leafCur.
2edb0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61  apPage[] and lea
2edc0 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20 20 20  fCur.aiIdx[].   
2edd0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20       ** may not 
2ede0 62 65 20 74 72 75 73 74 65 64 2e 0a 20 20 20 20  be trusted..    
2edf0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2ee00 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
2ee10 69 62 6c 65 20 74 6f 20 63 6f 70 79 20 74 68 65  ible to copy the
2ee20 20 61 6e 63 65 73 74 72 79 20 66 72 6f 6d 20 70   ancestry from p
2ee30 43 75 72 2c 20 61 73 20 74 68 65 20 73 61 6d 65  Cur, as the same
2ee40 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
2ee50 6e 63 65 28 29 20 63 61 6c 6c 20 68 61 73 20 69  nce() call has i
2ee60 6e 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 70  nvalidated the p
2ee70 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20 61 6e  Cur->apPage[] an
2ee80 64 20 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20  d aiIdx[].      
2ee90 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a 20 20    ** arrays. .  
2eea0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2eeb0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
2eec0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2eed0 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74 65 72  on() below inter
2eee0 6e 61 6c 6c 79 20 73 61 76 65 73 20 74 68 65 20  nally saves the 
2eef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  .        ** key 
2ef00 74 68 61 74 20 6c 65 61 66 43 75 72 20 69 73 20  that leafCur is 
2ef10 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2ef20 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e 74 6c 79  ng to. Currently
2ef30 2c 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  , there.        
2ef40 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f 70 69 65  ** are two copie
2ef50 73 20 6f 66 20 74 68 61 74 20 6b 65 79 20 69 6e  s of that key in
2ef60 20 74 68 65 20 74 72 65 65 20 2d 20 6f 6e 65 20   the tree - one 
2ef70 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 65 61 66  here on the leaf
2ef80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2ef90 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d 65   and one on some
2efa0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69   internal node i
2efb0 6e 20 74 68 65 20 74 72 65 65 2e 20 54 68 65 20  n the tree. The 
2efc0 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20 20 20  copy on.        
2efd0 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  ** the leaf node
2efe0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e   is always the n
2eff0 65 78 74 20 6b 65 79 20 69 6e 20 74 72 65 65 2d  ext key in tree-
2f000 6f 72 64 65 72 20 61 66 74 65 72 20 74 68 65 20  order after the 
2f010 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
2f020 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   on the internal
2f030 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65 20 63   node. So, the c
2f040 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
2f050 72 65 65 4e 65 78 74 28 29 0a 20 20 20 20 20 20  reeNext().      
2f060 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73 74 6f    ** calls resto
2f070 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2f080 28 29 20 74 6f 20 70 6f 69 6e 74 20 74 68 65 20  () to point the 
2f090 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 63 6f  cursor to the co
2f0a0 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  py.        ** st
2f0b0 6f 72 65 64 20 6f 6e 20 74 68 65 20 69 6e 74 65  ored on the inte
2f0c0 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65 6e 20  rnal node, then 
2f0d0 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68 65 20  advances to the 
2f0e0 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20 20 20 20  next entry,.    
2f0f0 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68 61 70      ** which hap
2f100 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 63  pens to be the c
2f110 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  opy of the key o
2f120 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
2f130 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ode..        ** 
2f140 4e 65 74 20 65 66 66 65 63 74 3a 20 6c 65 61 66  Net effect: leaf
2f150 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
2f160 62 61 63 6b 20 74 6f 20 74 68 65 20 64 75 70 6c  back to the dupl
2f170 69 63 61 74 65 20 63 65 6c 6c 0a 20 20 20 20 20  icate cell.     
2f180 20 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 73     ** that needs
2f190 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2c 20   to be removed, 
2f1a0 61 6e 64 20 74 68 65 20 6c 65 61 66 43 75 72 2e  and the leafCur.
2f1b0 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20 20 20  apPage[] and.   
2f1c0 20 20 20 20 20 2a 2a 20 6c 65 61 66 43 75 72 2e       ** leafCur.
2f1d0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 20 61  aiIdx[] arrays a
2f1e0 72 65 20 63 6f 72 72 65 63 74 2e 0a 20 20 20 20  re correct..    
2f1f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56      */.        V
2f200 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c 65  VA_ONLY( Pgno le
2f210 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66 50 61  afPgno = pLeafPa
2f220 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 20 20  ge->pgno );.    
2f230 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
2f240 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c 65 61  sorPosition(&lea
2f250 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 69  fCur);.        i
2f260 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2f280 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
2f290 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e  ext(&leafCur, &n
2f2a0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 20 20 20  otUsed);.       
2f2b0 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66   }.        pLeaf
2f2c0 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61  Page = leafCur.a
2f2d0 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50  pPage[leafCur.iP
2f2e0 61 67 65 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  age];.        as
2f2f0 73 65 72 74 28 20 70 4c 65 61 66 50 61 67 65 2d  sert( pLeafPage-
2f300 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20  >pgno==leafPgno 
2f310 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2f320 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  t( leafCur.aiIdx
2f330 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d  [leafCur.iPage]=
2f340 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
2f350 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2f360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f370 20 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66    dropCell(pLeaf
2f380 50 61 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29  Page, 0, szNext)
2f390 3b 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e  ;.        VVA_ON
2f3a0 4c 59 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65  LY( leafCur.page
2f3b0 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b  sShuffled = 0 );
2f3c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
2f3d0 6c 61 6e 63 65 28 26 6c 65 61 66 43 75 72 2c 20  lance(&leafCur, 
2f3e0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
2f3f0 72 74 28 20 6c 65 61 66 43 75 72 73 6f 72 49 6e  rt( leafCursorIn
2f400 76 61 6c 69 64 20 7c 7c 20 21 6c 65 61 66 43 75  valid || !leafCu
2f410 72 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64 0a  r.pagesShuffled.
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f440 20 20 20 7c 7c 20 21 70 43 75 72 2d 3e 70 61 67     || !pCur->pag
2f450 65 73 53 68 75 66 66 6c 65 64 20 29 3b 0a 20 20  esShuffled );.  
2f460 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2f470 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
2f480 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c  aseTempCursor(&l
2f490 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  eafCur);.  }else
2f4a0 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45  {.    TRACE(("DE
2f4b0 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
2f4c0 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20  elete from leaf 
2f4d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43  %d\n",.       pC
2f4e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2f4f0 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2f500 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
2f510 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74   idx, cellSizePt
2f520 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2f530 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
2f540 63 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d  ce(pCur, 0);.  }
2f550 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2f570 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2f580 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2f590 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2f5a0 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65   new BTree table
2f5b0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
2f5c0 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a  iTable the page.
2f5d0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
2f5e0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
2f5f0 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a  he new table..**
2f600 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20  .** The type of 
2f610 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e  type is determin
2f620 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20  ed by the flags 
2f630 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79  parameter.  Only
2f640 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
2f650 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67  g values of flag
2f660 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
2f670 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76  in use.  Other v
2f680 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61  alues for.** fla
2f690 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72  gs might not wor
2f6a0 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52  k:.**.**     BTR
2f6b0 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f  EE_INTKEY|BTREE_
2f6c0 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65  LEAFDATA     Use
2f6d0 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73  d for SQL tables
2f6e0 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73   with rowid keys
2f6f0 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45  .**     BTREE_ZE
2f700 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20  RODATA          
2f710 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72          Used for
2f720 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a   SQL indices.*/.
2f730 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2f740 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
2f750 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
2f760 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
2f770 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2f780 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
2f790 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67  age *pRoot;.  Pg
2f7a0 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69  no pgnoRoot;.  i
2f7b0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2f7c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2f7d0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2f7e0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2f7f0 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2f800 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2f810 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2f820 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f  saction first */
2f830 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2f840 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2f850 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2f860 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2f870 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2f880 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2f890 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66  dOnly );..#ifdef
2f8a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2f8b0 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61  OVACUUM.  rc = a
2f8c0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2f8d0 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2f8e0 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2f8f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f900 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
2f910 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e  else.  if( pBt->
2f920 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2f930 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b    Pgno pgnoMove;
2f940 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20        /* Move a 
2f950 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b  page here to mak
2f960 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72  e room for the r
2f970 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20  oot-page */.    
2f980 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f  MemPage *pPageMo
2f990 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ve; /* The page 
2f9a0 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a  to move to. */..
2f9b0 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20      /* Creating 
2f9c0 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20  a new table may 
2f9d0 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65  probably require
2f9e0 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74   moving an exist
2f9f0 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20  ing database.   
2fa00 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d   ** to make room
2fa10 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
2fa20 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49  les root page. I
2fa30 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65  n case this page
2fa40 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75   turns.    ** ou
2fa50 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66  t to be an overf
2fa60 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65  low page, delete
2fa70 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61   all overflow pa
2fa80 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20  ge-map caches.  
2fa90 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65    ** held by ope
2faa0 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a  n cursors..    *
2fab0 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  /.    invalidate
2fac0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
2fad0 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  (pBt);..    /* R
2fae0 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
2faf0 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68   meta[3] from th
2fb00 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65  e database to de
2fb10 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68  termine where th
2fb20 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
2fb30 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
2fb40 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d  ble should go. m
2fb50 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61  eta[3] is the la
2fb60 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2fb70 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73      ** created s
2fb80 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65  o far, so the ne
2fb90 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28  w root-page is (
2fba0 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20  meta[3]+1)..    
2fbb0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2fbc0 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2fbd0 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29  p, 4, &pgnoRoot)
2fbe0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2fbf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fc00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2fc10 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b  }.    pgnoRoot++
2fc20 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
2fc30 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20  w root-page may 
2fc40 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
2fc50 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   on a pointer-ma
2fc60 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20  p page, or the. 
2fc70 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
2fc80 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  TE page..    */.
2fc90 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52      while( pgnoR
2fca0 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  oot==PTRMAP_PAGE
2fcb0 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  NO(pBt, pgnoRoot
2fcc0 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e  ) ||.        pgn
2fcd0 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  oRoot==PENDING_B
2fce0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2fcf0 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b  .      pgnoRoot+
2fd00 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  +;.    }.    ass
2fd10 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33  ert( pgnoRoot>=3
2fd20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f   );..    /* Allo
2fd30 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65  cate a page. The
2fd40 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65   page that curre
2fd50 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20  ntly resides at 
2fd60 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20  pgnoRoot will.  
2fd70 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f    ** be moved to
2fd80 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2fd90 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20  age (unless the 
2fda0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2fdb0 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f  appens.    ** to
2fdc0 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52   reside at pgnoR
2fdd0 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oot)..    */.   
2fde0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2fdf0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50  reePage(pBt, &pP
2fe00 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f  ageMove, &pgnoMo
2fe10 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ve, pgnoRoot, 1)
2fe20 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2fe30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fe40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2fe50 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d  }..    if( pgnoM
2fe60 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b  ove!=pgnoRoot ){
2fe70 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f  .      /* pgnoRo
2fe80 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ot is the page t
2fe90 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
2fea0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
2feb0 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ge of.      ** t
2fec0 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73  he new table (as
2fed0 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  suming an error 
2fee0 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20  did not occur). 
2fef0 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20  But we were.    
2ff00 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
2ff10 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75  gnoMove. If requ
2ff20 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74  ired (i.e. if it
2ff30 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74   was not allocat
2ff40 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65  ed.      ** by e
2ff50 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c  xtending the fil
2ff60 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  e), the current 
2ff70 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e  page at position
2ff80 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20   pgnoMove.      
2ff90 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f  ** is already jo
2ffa0 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a  urnaled..      *
2ffb0 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  /.      u8 eType
2ffc0 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74  ;.      Pgno iPt
2ffd0 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65  rPage;..      re
2ffe0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d  leasePage(pPageM
2fff0 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ove);..      /* 
30000 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75  Move the page cu
30010 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52  rrently at pgnoR
30020 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e  oot to pgnoMove.
30030 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
30040 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
30050 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
30060 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
30070 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
300a0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
300b0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67  trmapGet(pBt, pg
300c0 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20  noRoot, &eType, 
300d0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
300e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
300f0 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  _OK || eType==PT
30100 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c  RMAP_ROOTPAGE ||
30110 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
30120 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
30130 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30140 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
30150 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30160 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
30170 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
30180 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  OTPAGE );.      
30190 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
301a0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
301b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
301c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
301d0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
301e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
301f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30200 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30210 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
30220 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30230 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  }.      rc = rel
30240 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
30250 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74  Root, eType, iPt
30260 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c  rPage, pgnoMove,
30270 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61   0);.      relea
30280 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a  sePage(pRoot);..
30290 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
302a0 74 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f  the page at pgno
302b0 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  Root */.      if
302c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
302d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
302e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
302f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30300 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
30310 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
30320 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
30330 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30340 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
30350 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
30360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30370 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
30380 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30390 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
303a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
303b0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
303c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
303d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
303e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
303f0 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65  Root = pPageMove
30400 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a  ;.    } ..    /*
30410 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   Update the poin
30420 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61  ter-map and meta
30430 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e  -data with the n
30440 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  ew root-page num
30450 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ber. */.    rc =
30460 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
30470 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50  pgnoRoot, PTRMAP
30480 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20  _ROOTPAGE, 0);. 
30490 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
304a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
304b0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
304c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
304d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
304e0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
304f0 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20   4, pgnoRoot);. 
30500 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
30510 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30520 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
30530 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
30540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
30550 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
30560 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
30570 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
30580 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
30590 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
305a0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73  ndif.  assert( s
305b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
305c0 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
305d0 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f  bPage) );.  zero
305e0 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67  Page(pRoot, flag
305f0 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  s | PTF_LEAF);. 
30600 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
30610 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  ef(pRoot->pDbPag
30620 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d  e);.  *piTable =
30630 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a   (int)pgnoRoot;.
30640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30650 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
30660 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
30670 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
30680 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
30690 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
306a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
306b0 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
306c0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
306d0 72 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65  rc = btreeCreate
306e0 54 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65  Table(p, piTable
306f0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  , flags);.  sqli
30700 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
30710 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
30720 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68  ../*.** Erase th
30730 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
30740 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74   page and all it
30750 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74  s children.  Ret
30760 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  urn.** the page 
30770 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
30780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
30790 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
307a0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
307b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
307c0 54 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63  The BTree that c
307d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c  ontains the tabl
307e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
307f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
30800 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  Page number to c
30810 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  lear */.  MemPag
30820 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
30830 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20  /* Parent page. 
30840 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f   NULL for the ro
30850 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65  ot */.  int free
30860 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a  PageFlag,     /*
30870 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65   Deallocate page
30880 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
30890 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20  t *pnChange.){. 
308a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
308b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
308c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
308d0 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pCell;.  int i;.
308e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
308f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
30900 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
30910 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
30920 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
30930 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
30940 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
30950 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63  _BKPT;.  }..  rc
30960 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
30970 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50  e(pBt, pgno, &pP
30980 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
30990 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
309a0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66  asepage_out;.  f
309b0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
309c0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
309d0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
309e0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
309f0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
30a00 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
30a10 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
30a20 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
30a30 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20  (pCell), pPage, 
30a40 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20  1, pnChange);.  
30a50 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
30a60 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
30a70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
30a80 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
30a90 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
30aa0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
30ab0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
30ac0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
30ad0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
30ae0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65   ){.    rc = cle
30af0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
30b00 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
30b10 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20  age->aData[8]), 
30b20 70 50 61 67 65 2c 20 31 2c 20 70 6e 43 68 61 6e  pPage, 1, pnChan
30b30 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
30b40 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
30b50 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
30b60 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e  }else if( pnChan
30b70 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
30b80 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
30b90 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65  );.    *pnChange
30ba0 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   += pPage->nCell
30bb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
30bc0 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
30bd0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
30be0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  age);.  }else if
30bf0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
30c00 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
30c10 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b  >pDbPage))==0 ){
30c20 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
30c30 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
30c40 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
30c50 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
30c60 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
30c70 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30c80 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
30c90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
30ca0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
30cb0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
30cc0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
30cd0 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
30ce0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
30cf0 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
30d00 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
30d10 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
30d20 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
30d30 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
30d40 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
30d50 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
30d60 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
30d70 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
30d80 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
30d90 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
30da0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
30db0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
30dc0 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
30dd0 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
30de0 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
30df0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
30e00 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20  pnChange is not 
30e10 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65  NULL, then table
30e20 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20   iTable must be 
30e30 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e  an intkey table.
30e40 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   The.** integer 
30e50 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f  value pointed to
30e60 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20   by pnChange is 
30e70 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74  incremented by t
30e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
30e90 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74  entries in the t
30ea0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
30eb0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
30ec0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
30ed0 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
30ee0 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20  nChange){.  int 
30ef0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
30f00 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
30f10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
30f20 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
30f30 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
30f40 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
30f50 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63  _WRITE ){.    rc
30f60 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
30f70 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
30f80 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
30f90 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
30fa0 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f  rc = checkReadLo
30fb0 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  cks(p, iTable, 0
30fc0 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , 1))!=SQLITE_OK
30fd0 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
30fe0 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
30ff0 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  lse if( SQLITE_O
31000 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
31010 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61  Cursors(pBt, iTa
31020 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  ble, 0)) ){.    
31030 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
31040 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
31050 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
31060 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67  asePage(pBt, (Pg
31070 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 2c  no)iTable, 0, 0,
31080 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a   pnChange);.  }.
31090 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
310a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
310b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
310c0 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
310d0 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61  ion in a table a
310e0 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20  nd add the root 
310f0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a  of the table to.
31100 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
31110 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f    Except, the ro
31120 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69  ot of the princi
31130 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f  ple table (the o
31140 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29  ne on.** page 1)
31150 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
31160 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
31170 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
31180 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
31190 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
311a0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
311b0 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  y open.** cursor
311c0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
311d0 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
311e0 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61  UUM is enabled a
311f0 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69  nd the page at i
31200 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65  Table is not the
31210 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61   last.** root pa
31220 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
31230 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
31240 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
31250 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61   .** in the data
31260 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76  base file is mov
31270 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74  ed into the slot
31280 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
31290 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20  ed by.** iTable 
312a0 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c  and that last sl
312b0 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
312c0 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74  pied by the last
312d0 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
312e0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
312f0 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f  eelist instead o
31300 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68  f iTable.  In th
31310 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72  is say, all.** r
31320 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65  oot pages are ke
31330 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  pt at the beginn
31340 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
31350 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a  ase file, which.
31360 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ** is necessary 
31370 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74  for AUTOVACUUM t
31380 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a  o work right.  *
31390 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
313a0 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e  o the .** page n
313b0 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20  umber that used 
313c0 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72  to be the last r
313d0 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
313e0 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  file before.** t
313f0 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20  he move.  If no 
31400 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c  page gets moved,
31410 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
31420 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61   to 0..** The la
31430 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  st root page is 
31440 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61  recorded in meta
31450 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75  [3] and the valu
31460 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20  e of.** meta[3] 
31470 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
31480 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  is procedure..*/
31490 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
314a0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
314b0 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
314c0 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
314d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
314e0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
314f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
31500 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
31510 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
31520 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
31530 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
31540 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
31550 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
31560 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
31570 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
31580 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
31590 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  }..  /* It is il
315a0 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20  legal to drop a 
315b0 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
315c0 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
315d0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
315e0 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
315f0 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
31600 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
31610 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
31620 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65  d to move anothe
31630 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66  r root-page to f
31640 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62  ill a gap left b
31650 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20  y the deleted.  
31660 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66  ** root page. If
31670 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
31680 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70  was using this p
31690 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
316a0 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e  uld .  ** occur.
316b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
316c0 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
316d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
316e0 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  CKED;.  }..  rc 
316f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
31700 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
31710 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c  )iTable, &pPage,
31720 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
31730 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
31740 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
31750 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62  earTable(p, iTab
31760 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  le, 0);.  if( rc
31770 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
31780 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
31790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
317a0 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
317b0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
317c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
317d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
317e0 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
317f0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
31800 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
31810 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
31820 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
31830 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
31840 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
31850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31860 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
31870 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a   &maxRootPgno);.
31880 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
318a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
318b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
318c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
318d0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  }..      if( iTa
318e0 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f  ble==maxRootPgno
318f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
31900 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
31910 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65  g dropped is the
31920 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
31930 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
31940 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
31950 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
31960 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f  ase, put the roo
31970 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  t page on the fr
31980 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  ee list. .      
31990 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
319a0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
319b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
319c0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
319d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
319e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
319f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
31a00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31a20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
31a30 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20  ng dropped does 
31a40 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72  not have the lar
31a50 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
31a60 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
31a70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
31a80 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61  . So move the pa
31a90 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74  ge that does int
31aa0 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
31ab0 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  * gap left by th
31ac0 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70  e deleted root-p
31ad0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  age..        */.
31ae0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
31af0 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20  *pMove;.        
31b00 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31b10 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
31b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
31b30 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
31b40 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
31b50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31b60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31b70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
31b80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
31b90 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
31ba0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
31bb0 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
31bc0 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c  PAGE, 0, iTable,
31bd0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c   0);.        rel
31be0 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
31bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
31c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31c10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
31c20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
31c30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31c40 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
31c50 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
31c60 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
31c70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31c90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31cb0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d  rc = freePage(pM
31cc0 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ove);.        re
31cd0 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
31ce0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31d00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
31d10 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
31d20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d        *piMoved =
31d30 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
31d40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
31d50 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78  Set the new 'max
31d60 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75  -root-page' valu
31d70 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
31d80 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20  e header. This. 
31d90 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f       ** is the o
31da0 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e  ld value less on
31db0 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65  e, less one more
31dc0 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   if that happens
31dd0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
31de0 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  a root-page numb
31df0 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61  er, less one aga
31e00 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68  in if that is th
31e10 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49  e.      ** PENDI
31e20 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20  NG_BYTE_PAGE..  
31e30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78      */.      max
31e40 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
31e50 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
31e60 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
31e70 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
31e80 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
31e90 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
31ea0 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
31eb0 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  o==PTRMAP_PAGENO
31ec0 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
31ed0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  o) ){.        ma
31ee0 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
31ef0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
31f00 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d  t( maxRootPgno!=
31f10 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31f20 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20  E(pBt) );..     
31f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
31f40 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
31f50 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  4, maxRootPgno);
31f60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31f70 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
31f80 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
31f90 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
31fa0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
31fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
31fc0 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  f sqlite3BtreeDr
31fd0 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c  opTable was call
31fe0 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ed on page 1. */
31ff0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
32000 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  age, PTF_INTKEY|
32010 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20  PTF_LEAF );.    
32020 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
32030 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
32040 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c   rc;  .}.int sql
32050 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
32060 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
32070 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
32080 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
32090 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
320a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
320b0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
320c0 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70    rc = btreeDrop
320d0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c  Table(p, iTable,
320e0 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c   piMoved);.  sql
320f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
32100 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
32110 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
32120 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  he meta-informat
32130 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74  ion out of a dat
32140 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74  abase file.  Met
32150 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e  a[0].** is the n
32160 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
32170 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
32180 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
32190 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75  Meta[1].** throu
321a0 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20  gh meta[15] are 
321b0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
321c0 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65  e by higher laye
321d0 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  rs.  Meta[0].** 
321e0 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
321f0 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61  e others are rea
32200 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20  d/write..** .** 
32210 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72  The schema layer
32220 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61   numbers meta va
32230 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79  lues differently
32240 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61  .  At the schema
32250 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74  .** layer (and t
32260 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64  he SetCookie and
32270 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f   ReadCookie opco
32280 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20  des) the number 
32290 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73  of.** free pages
322a0 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e   is not visible.
322b0 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69    So Cookie[0] i
322c0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65  s the same as Me
322d0 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ta[1]..*/.int sq
322e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
322f0 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
32300 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29  idx, u32 *pMeta)
32310 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
32320 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  age;.  int rc;. 
32330 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
32340 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pP1;.  BtShared 
32350 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
32360 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
32370 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
32380 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
32390 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d   Reading a meta-
323a0 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69  data value requi
323b0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
323c0 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68  on page 1 (and h
323d0 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71  ence.  ** the sq
323e0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
323f0 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20  e. We grab this 
32400 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20  lock regardless 
32410 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20  of whether or.  
32420 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54  ** not the SQLIT
32430 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
32440 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74  d flag is set (t
32450 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
32460 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69  at page.  ** 1 i
32470 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73  s treated as a s
32480 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71  pecial case by q
32490 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ueryTableLock() 
324a0 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  and lockTable())
324b0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ..  */.  rc = qu
324c0 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
324d0 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
324e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
324f0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
32500 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
32510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
32520 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
32530 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
32540 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  );.  if( pBt->pP
32550 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  age1 ){.    /* T
32560 68 65 20 62 2d 74 72 65 65 20 69 73 20 61 6c 72  he b-tree is alr
32570 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 20 72  eady holding a r
32580 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
32590 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
325a0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  se.    ** file. 
325b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
325c0 20 72 65 71 75 69 72 65 64 20 6d 65 74 61 2d 64   required meta-d
325d0 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20 62 65  ata value can be
325e0 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 0a 20   read directly. 
325f0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
32600 61 67 65 20 64 61 74 61 20 6f 66 20 74 68 69 73  age data of this
32610 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
32620 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
32630 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ter than.    ** 
32640 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e 65 77  requesting a new
32650 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d 20   reference from 
32660 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e  the pager layer.
32670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 31 20  .    */.    pP1 
32680 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
32690 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   *)pBt->pPage1->
326a0 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a  aData;.  }else{.
326b0 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72 65      /* The b-tre
326c0 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  e does not have 
326d0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
326e0 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
326f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
32700 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20 66 72  ** Obtain one fr
32710 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
32720 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  er..    */.    r
32730 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32740 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
32750 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   1, &pDbPage);. 
32760 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
32770 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
32780 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
32790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
327a0 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67      pP1 = (unsig
327b0 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74  ned char *)sqlit
327c0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
327d0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 2a  DbPage);.  }.  *
327e0 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65  pMeta = get4byte
327f0 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
32800 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ]);..  /* If the
32810 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74 20 68   b-tree is not h
32820 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
32830 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20 74 68  ce to page 1, th
32840 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20 2a 2a  en one was .  **
32850 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
32860 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
32870 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62 6c 6f  in the above blo
32880 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74 20 6e  ck. Release it n
32890 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ow..  */.  if( !
328a0 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20  pBt->pPage1 ){. 
328b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
328c0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
328d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f   }..  /* If auto
328e0 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61  vacuumed is disa
328f0 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
32900 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72  ld but we are tr
32910 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63  ying to .  ** ac
32920 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75  cess an autovacu
32930 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  umed database, t
32940 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74  hen make the dat
32950 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20  abase readonly. 
32960 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
32970 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32980 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34  UUM.  if( idx==4
32990 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70   && *pMeta>0 ) p
329a0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
329b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  ;.#endif..  /* G
329c0 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  rab the read-loc
329d0 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a  k on page 1. */.
329e0 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65    rc = lockTable
329f0 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b  (p, 1, READ_LOCK
32a00 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
32a10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
32a20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
32a30 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f   Write meta-info
32a40 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74  rmation back int
32a50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
32a60 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72   Meta[0] is.** r
32a70 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79  ead-only and may
32a80 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e   not be written.
32a90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
32aa0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 42  treeUpdateMeta(B
32ab0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  tree *p, int idx
32ac0 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20  , u32 iMeta){.  
32ad0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32ae0 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
32af0 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20  ed char *pP1;.  
32b00 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
32b10 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c  ( idx>=1 && idx<
32b20 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  =15 );.  sqlite3
32b30 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
32b40 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
32b50 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
32b60 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
32b70 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  ){.    rc = pBt-
32b80 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
32b90 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
32ba0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
32bb0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
32bc0 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
32bd0 29 3b 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74  );.    pP1 = pBt
32be0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
32bf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32c00 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
32c10 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
32c20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
32c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32c40 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31 5b    put4byte(&pP1[
32c50 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65  36 + idx*4], iMe
32c60 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ta);.#ifndef SQL
32c70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32c80 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 69 64  UUM.      if( id
32c90 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  x==7 ){.        
32ca0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
32cb0 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61  oVacuum || iMeta
32cc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
32cd0 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20  ssert( iMeta==0 
32ce0 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20  || iMeta==1 );. 
32cf0 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
32d00 56 61 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a  Vacuum = iMeta;.
32d10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
32d20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
32d30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
32d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32d50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
32d60 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20 74  e flag byte at t
32d70 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
32d80 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
32d90 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63  e cursor.** is c
32da0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
32db0 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  g to..*/.int sql
32dc0 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28 42  ite3BtreeFlags(B
32dd0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
32de0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
32df0 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51  about CURSOR_REQ
32e00 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20  UIRESEEK state? 
32e10 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f  Probably need to
32e20 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f   call.  ** resto
32e30 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
32e40 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  () here..  */.  
32e50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
32e60 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50    restoreCursorP
32e70 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
32e80 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
32e90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
32ea0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e];.  assert( cu
32eb0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
32ec0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
32ed0 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43  ( pPage->pBt==pC
32ee0 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74  ur->pBt );.  ret
32ef0 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67  urn pPage ? pPag
32f00 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
32f10 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a  hdrOffset] : 0;.
32f20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
32f30 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
32f40 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
32f50 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
32f60 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
32f70 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
32f80 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
32f90 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
32fa0 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
32fb0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
32fc0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
32fd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32fe0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32ff0 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
33000 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
33010 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
33020 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
33030 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
33040 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
33050 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
33060 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
33070 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
33080 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
33090 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
330a0 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
330b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
330c0 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
330d0 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
330e0 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
330f0 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43  ormat);.  if( pC
33100 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68  heck->errMsg.nCh
33110 61 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ar ){.    sqlite
33120 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
33130 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
33140 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20   "\n", 1);.  }. 
33150 20 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20   if( zMsg1 ){.  
33160 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
33170 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
33180 3e 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  >errMsg, zMsg1, 
33190 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  -1);.  }.  sqlit
331a0 65 33 56 58 50 72 69 6e 74 66 28 26 70 43 68 65  e3VXPrintf(&pChe
331b0 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a  ck->errMsg, 1, z
331c0 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
331d0 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
331e0 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e   pCheck->errMsg.
331f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
33200 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c      pCheck->mall
33210 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
33220 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
33230 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
33240 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
33250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33260 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
33270 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
33280 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
33290 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
332a0 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
332b0 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
332c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
332d0 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
332e0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
332f0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
33300 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
33310 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
33320 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
33330 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
33340 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
33350 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
33360 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
33370 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
33380 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
33390 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
333a0 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
333b0 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
333c0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
333d0 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61  , int iPage, cha
333e0 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
333f0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
33400 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
33410 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
33420 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b  ge || iPage<0 ){
33430 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
33440 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
33450 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70  text, "invalid p
33460 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20  age number %d", 
33470 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
33480 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
33490 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
334a0 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63  age]==1 ){.    c
334b0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
334c0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
334d0 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74  "2nd reference t
334e0 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  o page %d", iPag
334f0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
33500 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20  ;.  }.  return  
33510 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69  (pCheck->anRef[i
33520 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23  Page]++)>1;.}..#
33530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33540 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
33550 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
33560 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  he entry in the 
33570 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20  pointer-map for 
33580 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73  page iChild maps
33590 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61   to .** page iPa
335a0 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79  rent, pointer ty
335b0 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e  pe ptrType. If n
335c0 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72  ot, append an er
335d0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74  ror message.** t
335e0 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  o pCheck..*/.sta
335f0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74  tic void checkPt
33600 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74  rmap(.  Integrit
33610 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f  yCk *pCheck,   /
33620 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
33630 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  k context */.  P
33640 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
33650 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70        /* Child p
33660 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
33670 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
33680 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
33690 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74  ed pointer map t
336a0 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ype */.  Pgno iP
336b0 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
336c0 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
336d0 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70  ter map parent p
336e0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
336f0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
33700 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
33710 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75  t description (u
33720 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73  sed for error ms
33730 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  g) */.){.  int r
33740 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54  c;.  u8 ePtrmapT
33750 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  ype;.  Pgno iPtr
33760 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63  mapParent;..  rc
33770 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68   = ptrmapGet(pCh
33780 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64  eck->pBt, iChild
33790 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20  , &ePtrmapType, 
337a0 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b  &iPtrmapParent);
337b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
337c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63  E_OK ){.    chec
337d0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
337e0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
337f0 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
33800 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
33810 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
33820 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
33830 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
33840 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
33850 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
33860 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
33870 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
33880 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
33890 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
338a0 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
338b0 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
338c0 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
338d0 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
338e0 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
338f0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
33900 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
33910 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
33920 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
33930 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
33940 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
33950 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
33960 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
33970 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
33980 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
33990 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
339a0 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
339b0 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
339c0 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
339d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
339e0 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
339f0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
33a00 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
33a10 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
33a20 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
33a30 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
33a40 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
33a50 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
33a60 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
33a70 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
33a80 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
33a90 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
33aa0 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
33ab0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
33ac0 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
33ad0 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
33ae0 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
33af0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
33b00 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
33b10 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
33b20 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
33b30 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
33b40 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
33b50 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
33b60 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
33b70 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
33b80 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
33b90 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
33ba0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
33bb0 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
33bc0 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
33bd0 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
33be0 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
33bf0 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
33c00 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
33c10 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
33c20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
33c30 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
33c40 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
33c50 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
33c60 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
33c70 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
33c80 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
33c90 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
33ca0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
33cb0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
33cc0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
33cd0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
33ce0 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
33cf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33d00 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
33d10 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
33d20 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
33d30 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
33d40 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
33d50 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
33d60 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
33d70 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
33d80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33d90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33da0 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
33db0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
33dc0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
33dd0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
33de0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
33df0 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
33e00 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
33e10 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
33e20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
33e30 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b  sableSize/4-2 ){
33e40 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
33e50 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
33e60 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
33e70 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
33e80 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
33e90 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
33ea0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
33eb0 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
33ec0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
33ed0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
33ee0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
33ef0 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
33f00 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
33f10 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
33f20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33f30 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
33f40 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
33f50 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
33f60 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
33f70 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
33f80 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
33f90 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
33fa0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
33fb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
33fc0 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
33fd0 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
33fe0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
33ff0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
34000 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
34010 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
34020 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34030 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
34040 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
34050 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
34060 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
34070 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
34080 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
34090 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
340a0 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
340b0 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
340c0 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
340d0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
340e0 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
340f0 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
34100 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
34110 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
34120 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
34130 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
34140 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
34150 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
34160 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
34170 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
34180 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
34190 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
341a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
341b0 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
341c0 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
341d0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
341e0 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
341f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
34200 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
34210 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
34220 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
34230 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
34240 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
34250 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
34260 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
34270 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
34280 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
34290 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
342a0 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
342b0 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
342c0 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
342d0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
342e0 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
342f0 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
34300 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
34310 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
34320 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
34330 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
34340 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
34350 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
34360 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
34370 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
34380 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
34390 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
343a0 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
343b0 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
343c0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
343d0 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
343e0 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
343f0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
34400 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
34410 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
34420 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
34430 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
34440 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
34450 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
34460 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
34470 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
34480 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
34490 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
344a0 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
344b0 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
344c0 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
344d0 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
344e0 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
344f0 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
34500 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
34510 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
34520 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
34530 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
34540 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
34550 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
34560 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
34570 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
34580 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
34590 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
345a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
345b0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
345c0 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
345d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
345e0 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
345f0 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
34600 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e  char *zParentCon
34610 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20  text  /* Parent 
34620 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
34630 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
34640 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
34650 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
34660 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
34670 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
34680 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
34690 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
346a0 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
346b0 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
346c0 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
346d0 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74  r *hit;..  sqlit
346e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
346f0 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
34700 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
34710 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
34720 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
34730 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
34740 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
34750 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
34760 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
34770 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
34780 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
34790 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
347a0 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
347b0 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
347c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
347d0 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
347e0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
347f0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
34800 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b  pPage, 0))!=0 ){
34810 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
34820 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
34830 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
34840 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
34850 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
34860 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
34870 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
34880 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
34890 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
348a0 61 67 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  age))!=0 ){.    
348b0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
348c0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
348d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
348e0 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74 72       "sqlite3Btr
348f0 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65 74  eeInitPage() ret
34900 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20  urns error code 
34910 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  %d", rc);.    re
34920 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
34930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
34940 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
34950 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  out all the cell
34960 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20  s..  */.  depth 
34970 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
34980 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  i<pPage->nCell &
34990 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b  & pCheck->mxErr;
349a0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
349b0 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Cell;.    int sz
349c0 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ;.    CellInfo i
349d0 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  nfo;..    /* Che
349e0 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66  ck payload overf
349f0 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f  low pages.    */
34a00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
34a10 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
34a20 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
34a30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
34a40 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64 20  On tree page %d 
34a50 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67  cell %d: ", iPag
34a60 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c  e, i);.    pCell
34a70 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
34a80 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e,i);.    sqlite
34a90 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
34aa0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
34ab0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20   &info);.    sz 
34ac0 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  = info.nData;.  
34ad0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e    if( !pPage->in
34ae0 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66  tKey ) sz += inf
34af0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65  o.nKey;.    asse
34b00 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61  rt( sz==info.nPa
34b10 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28  yload );.    if(
34b20 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   sz>info.nLocal 
34b30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
34b40 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e  ge = (sz - info.
34b50 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53  nLocal + usableS
34b60 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65  ize - 5)/(usable
34b70 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20  Size - 4);.     
34b80 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
34b90 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
34ba0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
34bb0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34bc0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34bd0 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
34be0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
34bf0 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
34c00 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f  ap(pCheck, pgnoO
34c10 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
34c20 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43  FLOW1, iPage, zC
34c30 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
34c40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68  .#endif.      ch
34c50 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20  eckList(pCheck, 
34c60 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61  0, pgnoOvfl, nPa
34c70 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
34c80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
34c90 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66  ck sanity of lef
34ca0 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  t child page..  
34cb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
34cc0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
34cd0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
34ce0 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  te(pCell);.#ifnd
34cf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34d00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
34d10 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
34d20 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  uum ){.        c
34d30 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63  heckPtrmap(pChec
34d40 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  k, pgno, PTRMAP_
34d50 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43  BTREE, iPage, zC
34d60 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d  ontext);.      }
34d70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32  .#endif.      d2
34d80 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67 65   = checkTreePage
34d90 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61  (pCheck,pgno,pPa
34da0 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  ge,zContext);.  
34db0 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 64      if( i>0 && d
34dc0 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20  2!=depth ){.    
34dd0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
34de0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
34df0 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65  ext, "Child page
34e00 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22 29   depth differs")
34e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34e20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20  depth = d2;.    
34e30 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  }.  }.  if( !pPa
34e40 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
34e50 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
34e60 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
34e70 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
34e80 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ]);.    sqlite3_
34e90 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
34ea0 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74  zContext), zCont
34eb0 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ext, .          
34ec0 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70             "On p
34ed0 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74 20  age %d at right 
34ee0 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29  child: ", iPage)
34ef0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
34f00 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
34f10 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
34f20 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
34f30 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
34f40 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  heck, pgno, PTRM
34f50 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c  AP_BTREE, iPage,
34f60 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
34f70 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  f.    checkTreeP
34f80 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  age(pCheck, pgno
34f90 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , pPage, zContex
34fa0 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43  t);.  }. .  /* C
34fb0 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74  heck for complet
34fc0 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68  e coverage of th
34fd0 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61  e page.  */.  da
34fe0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
34ff0 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
35000 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68  ->hdrOffset;.  h
35010 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  it = sqlite3Page
35020 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
35030 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68  eSize );.  if( h
35040 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 68  it==0 ){.    pCh
35050 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  eck->mallocFaile
35060 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
35070 20 20 20 20 75 31 36 20 63 6f 6e 74 65 6e 74 4f      u16 contentO
35080 66 66 73 65 74 20 3d 20 67 65 74 32 62 79 74 65  ffset = get2byte
35090 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
350a0 20 20 20 20 69 66 20 28 63 6f 6e 74 65 6e 74 4f      if (contentO
350b0 66 66 73 65 74 20 3e 20 75 73 61 62 6c 65 53 69  ffset > usableSi
350c0 7a 65 29 20 7b 0a 20 20 20 20 20 20 63 68 65 63  ze) {.      chec
350d0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
350e0 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
350f0 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72              "Cor
35100 72 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64  ruption detected
35110 20 69 6e 20 68 65 61 64 65 72 20 6f 6e 20 70 61   in header on pa
35120 67 65 20 25 64 22 2c 69 50 61 67 65 2c 30 29 3b  ge %d",iPage,0);
35130 0a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 4f 66  .      contentOf
35140 66 73 65 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  fset = usableSiz
35150 65 3b 20 2f 2a 20 74 72 79 20 74 6f 20 6b 65 65  e; /* try to kee
35160 70 20 67 6f 69 6e 67 20 2a 2f 0a 20 20 20 20 7d  p going */.    }
35170 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2b  .    memset(hit+
35180 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 2c 20 30  contentOffset, 0
35190 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 63 6f 6e  , usableSize-con
351a0 74 65 6e 74 4f 66 66 73 65 74 29 3b 0a 20 20 20  tentOffset);.   
351b0 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20   memset(hit, 1, 
351c0 63 6f 6e 74 65 6e 74 4f 66 66 73 65 74 29 3b 0a  contentOffset);.
351d0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32      nCell = get2
351e0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
351f0 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72  ]);.    cellStar
35200 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
35210 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
35220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
35230 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
35240 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
35250 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72  e(&data[cellStar
35260 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75  t+i*2]);.      u
35270 31 36 20 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  16 size = 1024;.
35280 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
35290 20 20 20 69 66 28 20 70 63 3c 3d 75 73 61 62 6c     if( pc<=usabl
352a0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
352b0 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
352c0 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
352d0 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [pc]);.      }. 
352e0 20 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a       if( (pc+siz
352f0 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
35300 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20   || pc<0 ){.    
35310 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
35320 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
35330 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
35340 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
35350 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
35360 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
35370 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
35380 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63          for(j=pc
35390 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20  +size-1; j>=pc; 
353a0 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
353b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
353c0 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65   for(cnt=0, i=ge
353d0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
353e0 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75  +1]); i>0 && i<u
353f0 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74  sableSize && cnt
35400 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20  <10000; .       
35410 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20      cnt++){.    
35420 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74    int size = get
35430 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d  2byte(&data[i+2]
35440 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
35450 20 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a        if( (i+siz
35460 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
35470 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20   || i<0 ){.     
35480 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
35490 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20  g(pCheck, 0,  . 
354a0 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
354b0 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
354c0 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
354d0 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
354e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
354f0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
35500 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d  size-1; j>=i; j-
35510 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
35520 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67     }.      i = g
35530 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d  et2byte(&data[i]
35540 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
35550 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62  (i=cnt=0; i<usab
35560 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  leSize; i++){.  
35570 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d      if( hit[i]==
35580 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74  0 ){.        cnt
35590 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
355a0 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a  if( hit[i]>1 ){.
355b0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
355c0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
355d0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c  ,.          "Mul
355e0 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62  tiple uses for b
355f0 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25  yte %d of page %
35600 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20  d", i, iPage);. 
35610 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35620 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35630 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64  if( cnt!=data[hd
35640 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68  r+7] ){.      ch
35650 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
35660 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
35670 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73     "Fragmented s
35680 70 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20  pace is %d byte 
35690 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f  reported as %d o
356a0 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20  n page %d",.    
356b0 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b        cnt, data[
356c0 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a  hdr+7], iPage);.
356d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
356e0 74 65 33 50 61 67 65 46 72 65 65 28 68 69 74 29  te3PageFree(hit)
356f0 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
35700 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
35710 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e  n depth+1;.}.#en
35720 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
35730 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
35740 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
35750 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
35760 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
35770 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
35780 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68  es a complete ch
35790 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eck of the given
357a0 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52   BTree file.  aR
357b0 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61  oot[] is.** an a
357c0 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75  rray of pages nu
357d0 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20  mbers were each 
357e0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74  page number is t
357f0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a  he root page of.
35800 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f  ** a table.  nRo
35810 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ot is the number
35820 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
35830 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  Root..**.** Writ
35840 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
35850 65 72 72 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70  error seen in *p
35860 6e 45 72 72 2e 20 20 45 78 63 65 70 74 20 66 6f  nErr.  Except fo
35870 72 20 73 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a  r some memory.**
35880 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
35890 72 73 2c 20 20 6e 6e 20 65 72 72 6f 72 20 6d 65  rs,  nn error me
358a0 73 73 61 67 65 20 69 73 20 68 65 6c 64 20 69 6e  ssage is held in
358b0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
358c0 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20   from.** malloc 
358d0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 2a  is returned if *
358e0 70 6e 45 72 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  pnErr is non-zer
358f0 6f 2e 20 20 49 66 20 2a 70 6e 45 72 72 3d 3d 30  o.  If *pnErr==0
35900 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a   then NULL is.**
35910 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
35920 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
35930 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a  IntegrityCheck(.
35940 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
35950 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
35960 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
35970 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a  int *aRoot,   /*
35980 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f   An array of roo
35990 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  t pages numbers 
359a0 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74  for individual t
359b0 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rees */.  int nR
359c0 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65  oot,    /* Numbe
359d0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
359e0 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aRoot[] */.  int
359f0 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74   mxErr,    /* St
35a00 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72  op reporting err
35a10 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d  ors after this m
35a20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  any */.  int *pn
35a30 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Err    /* Write 
35a40 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
35a50 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61   seen to this va
35a60 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  riable */.){.  i
35a70 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66  nt i;.  int nRef
35a80 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  ;.  IntegrityCk 
35a90 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72  sCheck;.  BtShar
35aa0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
35ab0 3b 0a 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30  ;.  char zErr[10
35ac0 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  0];..  sqlite3Bt
35ad0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
35ae0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
35af0 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33    nRef = sqlite3
35b00 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
35b10 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
35b20 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  ( lockBtreeWithR
35b30 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f  etry(p)!=SQLITE_
35b40 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72  OK ){.    *pnErr
35b50 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
35b60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
35b70 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
35b80 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 22 63  e3DbStrDup(0, "c
35b90 61 6e 6e 6f 74 20 61 63 71 75 69 72 65 20 61 20  annot acquire a 
35ba0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
35bb0 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d   database");.  }
35bc0 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20  .  sCheck.pBt = 
35bd0 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50  pBt;.  sCheck.pP
35be0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
35bf0 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61  er;.  sCheck.nPa
35c00 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
35c10 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65  unt(sCheck.pPage
35c20 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45  r);.  sCheck.mxE
35c30 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43  rr = mxErr;.  sC
35c40 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  heck.nErr = 0;. 
35c50 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61   sCheck.mallocFa
35c60 69 6c 65 64 20 3d 20 30 3b 0a 20 20 2a 70 6e 45  iled = 0;.  *pnE
35c70 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rr = 0;.#ifndef 
35c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35c90 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
35ca0 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ->nTrunc!=0 ){. 
35cb0 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20     sCheck.nPage 
35cc0 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
35cd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
35ce0 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20  sCheck.nPage==0 
35cf0 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
35d00 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
35d10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
35d20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
35d30 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
35d40 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71  Check.anRef = sq
35d50 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43  lite3Malloc( (sC
35d60 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
35d70 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
35d80 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
35d90 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
35da0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
35db0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
35dc0 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20    *pnErr = 1;.  
35dd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
35de0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
35df0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
35e00 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=0; i<=sCheck.n
35e10 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65  Page; i++){ sChe
35e20 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b  ck.anRef[i] = 0;
35e30 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47   }.  i = PENDING
35e40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b  _BYTE_PAGE(pBt);
35e50 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b  .  if( i<=sCheck
35e60 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43  .nPage ){.    sC
35e70 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
35e80 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
35e90 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 43  StrAccumInit(&sC
35ea0 68 65 63 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72  heck.errMsg, zEr
35eb0 72 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c  r, sizeof(zErr),
35ec0 20 32 30 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43   20000);..  /* C
35ed0 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
35ee0 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
35ef0 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c  st.  */.  checkL
35f00 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20  ist(&sCheck, 1, 
35f10 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
35f20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
35f30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ),.            g
35f40 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
35f50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
35f60 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74  , "Main freelist
35f70 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  : ");..  /* Chec
35f80 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  k all the tables
35f90 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
35fa0 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68  ; i<nRoot && sCh
35fb0 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
35fc0 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69  .    if( aRoot[i
35fd0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
35fe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35ff0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
36000 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
36010 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74  oVacuum && aRoot
36020 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63  [i]>1 ){.      c
36030 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65  heckPtrmap(&sChe
36040 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54  ck, aRoot[i], PT
36050 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
36060 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
36070 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
36080 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52  Page(&sCheck, aR
36090 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74  oot[i], 0, "List
360a0 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20   of tree roots: 
360b0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ");.  }..  /* Ma
360c0 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61  ke sure every pa
360d0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  ge in the file i
360e0 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a  s referenced.  *
360f0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  /.  for(i=1; i<=
36100 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20  sCheck.nPage && 
36110 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
36120 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  +){.#ifdef SQLIT
36130 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
36140 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  M.    if( sCheck
36150 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a  .anRef[i]==0 ){.
36160 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
36170 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
36180 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
36190 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
361a0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
361b0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
361c0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
361d0 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65  acuum, make sure
361e0 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61   no tables conta
361f0 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  in.    ** refere
36200 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d  nces to pointer-
36210 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a  map pages..    *
36220 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  /.    if( sCheck
36230 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20  .anRef[i]==0 && 
36240 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
36250 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d  PAGENO(pBt, i)!=
36260 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56  i || !pBt->autoV
36270 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20  acuum) ){.      
36280 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
36290 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65  sCheck, 0, "Page
362a0 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65   %d is never use
362b0 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  d", i);.    }.  
362c0 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
362d0 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20  ef[i]!=0 && .   
362e0 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
362f0 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26  NO(pBt, i)==i &&
36300 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
36310 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
36320 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
36330 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d  k, 0, "Pointer m
36340 61 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65  ap page %d is re
36350 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20  ferenced", i);. 
36360 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
36370 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
36380 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69  this analysis di
36390 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20  d not leave any 
363a0 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20  unref() pages.  
363b0 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  */.  unlockBtree
363c0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
363d0 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c   if( nRef != sql
363e0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
363f0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
36400 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
36410 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
36420 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e   .      "Outstan
36430 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20  ding page count 
36440 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20  goes from %d to 
36450 25 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61  %d during this a
36460 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20  nalysis",.      
36470 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67  nRef, sqlite3Pag
36480 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
36490 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20  pPager).    );. 
364a0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20   }..  /* Clean  
364b0 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72  up and report er
364c0 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rors..  */.  sql
364d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
364e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
364f0 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b  e(sCheck.anRef);
36500 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6d 61  .  if( sCheck.ma
36510 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
36520 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
36530 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65  mReset(&sCheck.e
36540 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45  rrMsg);.    *pnE
36550 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
36560 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
36570 3b 0a 20 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d  ;.  }.  *pnErr =
36580 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20   sCheck.nErr;.  
36590 69 66 28 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d  if( sCheck.nErr=
365a0 3d 30 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  =0 ) sqlite3StrA
365b0 63 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63  ccumReset(&sChec
365c0 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72 65 74  k.errMsg);.  ret
365d0 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
365e0 63 75 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63  cumFinish(&sChec
365f0 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e  k.errMsg);.}.#en
36600 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
36610 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
36620 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CK */../*.** Ret
36630 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
36640 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64  hname of the und
36650 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
36660 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
36670 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20   pager filename 
36680 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
36690 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
366a0 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
366b0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
366c0 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
366d0 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
366e0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
366f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
36700 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  ilename(Btree *p
36710 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
36720 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
36730 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
36740 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
36750 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
36760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
36770 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
36780 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
36790 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
367a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
367b0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
367c0 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69  directory name 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 44 69  qlite3BtreeGetDi
36850 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  rname(Btree *p){
36860 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
36870 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
36880 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
36890 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e  PagerDirname(p->
368a0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
368b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
368c0 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
368d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
368e0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
368f0 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20  . The return.** 
36900 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f  value of this ro
36910 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d  utine is the sam
36920 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  e regardless of 
36930 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72  whether the jour
36940 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  nal file.** has 
36950 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20  been created or 
36960 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  not..**.** The p
36970 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ager journal fil
36980 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61  ename is invaria
36990 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
369a0 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
369b0 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
369c0 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
369d0 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
369e0 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
369f0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
36a00 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
36a10 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
36a20 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
36a30 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
36a40 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
36a50 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70  Journalname(p->p
36a60 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
36a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36a80 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
36a90 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65   Copy the comple
36aa0 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42  te content of pB
36ab0 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f  tFrom into pBtTo
36ac0 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
36ad0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69  .** must be acti
36ae0 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65  ve for both file
36af0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  s..**.** The siz
36b00 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61  e of file pTo ma
36b10 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20  y be reduced by 
36b20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
36b30 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
36b40 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74  oes wrong, the t
36b50 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54  ransaction on pT
36b60 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o is rolled back
36b70 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
36b80 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68  essful, CommitPh
36b90 61 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20  aseOne() may be 
36ba0 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65  called on pTo be
36bb0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
36bc0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
36bd0 68 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d  hould finish com
36be0 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e  mitting the tran
36bf0 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62  saction on pTo b
36c00 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  y calling.** sql
36c10 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
36c20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
36c30 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42   btreeCopyFile(B
36c40 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
36c50 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
36c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
36c70 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e    Pgno i;..  Pgn
36c80 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20  o nFromPage;    
36c90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
36ca0 67 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a  ges in pFrom */.
36cb0 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20    Pgno nToPage; 
36cc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
36cd0 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20  of pages in pTo 
36ce0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61  */.  Pgno nNewPa
36cf0 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ge;      /* Numb
36d00 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
36d10 54 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f 70  To after the cop
36d20 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b  y */..  Pgno iSk
36d30 69 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ip;         /* P
36d40 65 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67 65  ending byte page
36d50 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74   in pTo */.  int
36d60 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20   nToPageSize;   
36d70 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66   /* Page size of
36d80 20 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f   pTo in bytes */
36d90 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65  .  int nFromPage
36da0 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73  Size;  /* Page s
36db0 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20  ize of pFrom in 
36dc0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68  bytes */..  BtSh
36dd0 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54  ared *pBtTo = pT
36de0 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72  o->pBt;.  BtShar
36df0 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46  ed *pBtFrom = pF
36e00 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54  rom->pBt;.  pBtT
36e10 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b  o->db = pTo->db;
36e20 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d  .  pBtFrom->db =
36e30 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e   pFrom->db;..  n
36e40 54 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  ToPageSize = pBt
36e50 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  To->pageSize;.  
36e60 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20  nFromPageSize = 
36e70 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a  pBtFrom->pageSiz
36e80 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69  e;..  if( pTo->i
36e90 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
36ea0 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e  ITE || pFrom->in
36eb0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
36ec0 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
36ed0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
36ee0 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e   }.  if( pBtTo->
36ef0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
36f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
36f10 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67  Y;.  }..  nToPag
36f20 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
36f30 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nt(pBtTo->pPager
36f40 29 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d  );.  nFromPage =
36f50 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
36f60 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29  pBtFrom->pPager)
36f70 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44  ;.  iSkip = PEND
36f80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
36f90 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69  tTo);..  /* Vari
36fa0 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20 69 73  able nNewPage is
36fb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
36fc0 61 67 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ages required to
36fd0 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20   store the.  ** 
36fe0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72 6f  contents of pFro
36ff0 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  m using the curr
37000 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  ent page-size of
37010 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65   pTo..  */.  nNe
37020 77 50 61 67 65 20 3d 20 28 28 69 36 34 29 6e 46  wPage = ((i64)nF
37030 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34 29 6e  romPage * (i64)n
37040 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20 28  FromPageSize + (
37050 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 20  i64)nToPageSize 
37060 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20 28 69  - 1) / .      (i
37070 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a  64)nToPageSize;.
37080 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d  .  for(i=1; rc==
37090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c  SQLITE_OK && (i<
370a0 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e  =nToPage || i<=n
370b0 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a  NewPage); i++){.
370c0 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20  .    /* Journal 
370d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
370e0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
370f0 20 69 53 6b 69 70 20 69 73 20 74 68 65 20 70 61   iSkip is the pa
37100 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
37110 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 28 50   locking page (P
37120 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
37130 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61 74 61  ).    ** in data
37140 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66 6f 72  base *pTo (befor
37150 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54 68 69  e the copy). Thi
37160 73 20 70 61 67 65 20 69 73 20 6e 65 76 65 72 20  s page is never 
37170 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20  written .    ** 
37180 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
37190 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d   file. Unless i=
371a0 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20 70 61  =iSkip or the pa
371b0 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a  ge was not.    *
371c0 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70 54 6f  * present in pTo
371d0 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79   before the copy
371e0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72   operation, jour
371f0 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f 6d 20  nal page i from 
37200 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  pTo..    */.    
37210 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26 26 20  if( i!=iSkip && 
37220 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20  i<=nToPage ){.  
37230 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
37240 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
37250 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37260 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  Get(pBtTo->pPage
37270 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b  r, i, &pDbPage);
37280 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
37290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
372a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
372b0 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
372c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
372d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
372e0 26 20 69 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b  & i>nFromPage ){
372f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 59 65  .          /* Ye
37300 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69  ah.  It seems wi
37310 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74  erd to call Dont
37320 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66  Write() right af
37330 74 65 72 20 57 72 69 74 65 28 29 2e 20 42 75 74  ter Write(). But
37340 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
37350 61 74 20 69 73 20 62 65 63 61 75 73 65 20 74 68  at is because th
37360 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65  e names of those
37370 20 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e   procedures do n
37380 6f 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20  ot exactly .    
37390 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65        ** represe
373a0 6e 74 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e  nt what they do.
373b0 20 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79    Write() really
373c0 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69 73   means "put this
373d0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20   page in the.   
373e0 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61         ** rollba
373f0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d  ck journal and m
37400 61 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20  ark it as dirty 
37410 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
37420 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  be written.     
37430 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64       ** to the d
37440 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61 74  atabase file lat
37450 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65 28  er."  DontWrite(
37460 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65 63  ) undoes the sec
37470 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20 20  ond part of.    
37480 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e        ** that an
37490 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  d prevents the p
374a0 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77  age from being w
374b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
374c0 74 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20  tabase. The.    
374d0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
374e0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f   still on the ro
374f0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
37500 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61  though.  And tha
37510 74 20 69 73 20 74 68 65 20 0a 20 20 20 20 20 20  t is the .      
37520 20 20 20 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69      ** whole poi
37530 6e 74 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b  nt of this block
37540 3a 20 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f  : to put pages o
37550 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
37560 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20  ournal. .       
37570 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
37580 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37590 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61  rDontWrite(pDbPa
375a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
375b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
375c0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
375d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
375e0 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69  ..    /* Overwri
375f0 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 70  te the data in p
37600 61 67 65 20 69 20 6f 66 20 74 68 65 20 74 61 72  age i of the tar
37610 67 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  get database */.
37620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37630 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69  TE_OK && i!=iSki
37640 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65  p && i<=nNewPage
37650 20 29 7b 0a 0a 20 20 20 20 20 20 44 62 50 61 67   ){..      DbPag
37660 65 20 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a  e *pToPage = 0;.
37670 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
37680 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  t64 iOff;..     
37690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
376a0 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  erGet(pBtTo->pPa
376b0 67 65 72 2c 20 69 2c 20 26 70 54 6f 50 61 67 65  ger, i, &pToPage
376c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
376d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
376e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
376f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 6f  e3PagerWrite(pTo
37700 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Page);.      }..
37710 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20        for(.     
37720 20 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54     iOff=(i-1)*nT
37730 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20  oPageSize; .    
37740 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
37750 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50  K && iOff<i*nToP
37760 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20  ageSize; .      
37770 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50    iOff += nFromP
37780 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 29 7b  ageSize.      ){
37790 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
377a0 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a  *pFromPage = 0;.
377b0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
377c0 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d  om = (iOff/nFrom
377d0 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20  PageSize)+1;..  
377e0 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
377f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
37800 47 45 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20  GE(pBtFrom) ){. 
37810 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
37820 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  e;.        }..  
37830 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37840 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
37850 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f  om->pPager, iFro
37860 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a  m, &pFromPage);.
37870 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
37880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37890 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
378a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
378b0 65 74 44 61 74 61 28 70 54 6f 50 61 67 65 29 3b  etData(pToPage);
378c0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
378d0 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33  *zFrom = sqlite3
378e0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72  PagerGetData(pFr
378f0 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  omPage);.       
37900 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20     int nCopy;.. 
37910 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 46 72           if( nFr
37920 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50  omPageSize>=nToP
37930 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
37940 20 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20         zFrom += 
37950 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69  ((i-1)*nToPageSi
37960 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a  ze - ((iFrom-1)*
37970 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b  nFromPageSize));
37980 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
37990 70 79 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65  py = nToPageSize
379a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
379b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e{.            z
379c0 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31  To += (((iFrom-1
379d0 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  )*nFromPageSize)
379e0 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65   - (i-1)*nToPage
379f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
37a00 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d     nCopy = nFrom
37a10 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  PageSize;.      
37a20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
37a30 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72   memcpy(zTo, zFr
37a40 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  om, nCopy);.    
37a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
37a60 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67  erUnref(pFromPag
37a70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
37a80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
37a90 20 70 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20   pToPage ){.    
37aa0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d      MemPage *p =
37ab0 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
37ac0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
37ad0 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20  (pToPage);.     
37ae0 20 20 20 70 2d 3e 69 73 49 6e 69 74 20 3d 20 30     p->isInit = 0
37af0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
37b00 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 6f 50  3PagerUnref(pToP
37b10 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
37b20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
37b30 20 74 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72   things have wor
37b40 6b 65 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20  ked so far, the 
37b50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
37b60 79 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20  y need to be .  
37b70 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  ** truncated. Th
37b80 65 20 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69  e complex part i
37b90 73 20 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65  s that it may ne
37ba0 65 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74  ed to be truncat
37bb0 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a  ed to.  ** a siz
37bc0 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e  e that is not an
37bd0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
37be0 65 20 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65  e of nToPageSize
37bf0 20 2d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20   - the current. 
37c00 20 2a 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73   ** page size us
37c10 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ed by the pager 
37c20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37c30 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a  B-Tree pTo..  **
37c40 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  .  ** For exampl
37c50 65 2c 20 73 61 79 20 74 68 65 20 70 61 67 65 2d  e, say the page-
37c60 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32  size of pTo is 2
37c70 30 34 38 20 62 79 74 65 73 20 61 6e 64 20 74 68  048 bytes and th
37c80 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a  e original .  **
37c90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
37ca0 20 69 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c   is 5 (10 KB fil
37cb0 65 29 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73  e). If pFrom has
37cc0 20 61 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20   a page size of 
37cd0 31 30 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73  1024 .  ** bytes
37ce0 20 61 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68   and 9 pages, th
37cf0 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64  en the file need
37d00 73 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65  s to be truncate
37d10 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20  d to 9KB..  */. 
37d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37d30 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46  OK ){.    if( nF
37d40 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f  romPageSize!=nTo
37d50 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  PageSize ){.    
37d60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
37d70 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
37d80 61 67 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e  agerFile(pBtTo->
37d90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
37da0 36 34 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29  64 iSize = (i64)
37db0 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20  nFromPageSize * 
37dc0 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a  (i64)nFromPage;.
37dd0 20 20 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d        i64 iNow =
37de0 20 28 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e   (i64)((nToPage>
37df0 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67  nNewPage)?nToPag
37e00 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69  e:nNewPage) * (i
37e10 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  64)nToPageSize; 
37e20 0a 20 20 20 20 20 20 69 36 34 20 69 50 65 6e 64  .      i64 iPend
37e30 69 6e 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44  ing = ((i64)PEND
37e40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
37e50 74 54 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54  tTo)-1) *(i64)nT
37e60 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20  oPageSize;.  .  
37e70 20 20 20 20 61 73 73 65 72 74 28 20 69 53 69 7a      assert( iSiz
37e80 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20  e<=iNow );.  .  
37e90 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68      /* Commit ph
37ea0 61 73 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68  ase one syncs th
37eb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
37ec0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
37ed0 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  To .      ** con
37ee0 74 61 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67  taining the orig
37ef0 69 6e 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f  inal data. It do
37f00 65 73 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  es not sync the 
37f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
37f20 20 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41      ** itself. A
37f30 66 74 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20  fter doing this 
37f40 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
37f50 65 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61  e OsTruncate() a
37f60 6e 64 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  nd other.      *
37f70 2a 20 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74  * file APIs on t
37f80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37f90 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20   directly..     
37fa0 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d   */.      pBtTo-
37fb0 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20  >db = pTo->db;. 
37fc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37fd0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
37fe0 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  eOne(pBtTo->pPag
37ff0 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20  er, 0, 0, 1);.  
38000 20 20 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e      if( iSize<iN
38010 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ow && rc==SQLITE
38020 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
38030 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
38040 6e 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69  ncate(pFile, iSi
38050 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  ze);.      }.  .
38060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
38070 70 20 74 68 61 74 20 63 6f 70 69 65 64 20 64 61  p that copied da
38080 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  ta from database
38090 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69   pFrom to pTo di
380a0 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70  d not.      ** p
380b0 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b  opulate the lock
380c0 69 6e 67 20 70 61 67 65 20 6f 66 20 64 61 74 61  ing page of data
380d0 62 61 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65  base pTo. If the
380e0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20   page-size of.  
380f0 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20      ** pFrom is 
38100 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61  smaller than tha
38110 74 20 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d  t of pTo, this m
38120 65 61 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77  eans some data w
38130 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74  ill.      ** not
38140 20 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65   have been copie
38150 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d. .      **.   
38160 20 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b     ** This block
38170 20 63 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73   copies the miss
38180 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61  ing data from da
38190 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20  tabase pFrom to 
381a0 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73  pTo .      ** us
381b0 69 6e 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54  ing file APIs. T
381c0 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
381d0 75 73 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e  use at this poin
381e0 74 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20  t we know that. 
381f0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74       ** all of t
38200 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
38210 20 66 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65   from pTo has be
38220 65 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  en synced into t
38230 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
38240 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68  rnal file. At th
38250 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c  is point it woul
38260 64 20 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20  d be safe to do 
38270 61 6e 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20  anything at.    
38280 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20    ** all to the 
38290 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 65 78  database file ex
382a0 63 65 70 74 20 74 72 75 6e 63 61 74 65 20 69 74  cept truncate it
382b0 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a   to zero bytes..
382c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
382d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
382e0 20 26 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a   && nFromPageSiz
382f0 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65 20 26 26  e<nToPageSize &&
38300 20 69 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29   iSize>iPending)
38310 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f  {.        i64 iO
38320 66 66 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ff;.        for(
38330 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 3d  .          iOff=
38340 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20  iPending; .     
38350 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
38360 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69 50 65 6e  OK && iOff<(iPen
38370 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65  ding+nToPageSize
38380 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ); .          iO
38390 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53  ff += nFromPageS
383a0 69 7a 65 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ize.        ){. 
383b0 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
383c0 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a  *pFromPage = 0;.
383d0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
383e0 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72  From = (iOff/nFr
383f0 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20  omPageSize)+1;. 
38400 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
38410 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42  iFrom==PENDING_B
38420 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d  YTE_PAGE(pBtFrom
38430 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46