/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 680c357b178146dd37910f42f9e6e8a2a7b1e61d:


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 34 35 30 20 32 30 30 38 2f 30  c,v 1.450 2008/0
0190: 34 2f 30 32 20 31 38 3a 33 33 3a 30 38 20 64 72  4/02 18:33:08 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53   macro..*/.#if S
0380: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
0390: 71 6c 69 74 65 33 42 74 72 65 65 54 72 61 63 65  qlite3BtreeTrace
03a0: 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
03b0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
03c0: 2f 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 6e  /.#endif....#ifn
03d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
03e0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
03f0: 2a 2a 20 41 20 66 6c 61 67 20 74 6f 20 69 6e 64  ** A flag to ind
0400: 69 63 61 74 65 20 77 68 65 74 68 65 72 20 6f 72  icate whether or
0410: 20 6e 6f 74 20 73 68 61 72 65 64 20 63 61 63 68   not shared cach
0420: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 20 41  e is enabled.  A
0430: 6c 73 6f 2c 0a 2a 2a 20 61 20 6c 69 73 74 20 6f  lso,.** a list o
0440: 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  f BtShared objec
0450: 74 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67  ts that are elig
0460: 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69 63 69  ible for partici
0470: 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61  pation.** in sha
0480: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 20  red cache.  The 
0490: 76 61 72 69 61 62 6c 65 73 20 68 61 76 65 20 66  variables have f
04a0: 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e 67  ile scope during
04b0: 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c 0a   normal builds,.
04c0: 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74 20  ** but the test 
04d0: 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74 6f  harness needs to
04e0: 20 61 63 63 65 73 73 20 74 68 65 73 65 20 76 61   access these va
04f0: 72 69 61 62 6c 65 73 20 73 6f 20 77 65 20 6d 61  riables so we ma
0500: 6b 65 20 74 68 65 6d 0a 2a 2a 20 67 6c 6f 62 61  ke them.** globa
0510: 6c 20 66 6f 72 20 74 65 73 74 20 62 75 69 6c 64  l for test build
0520: 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
0530: 49 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65  ITE_TEST.BtShare
0540: 64 20 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64  d *sqlite3Shared
0550: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 69  CacheList = 0;.i
0560: 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  nt sqlite3Shared
0570: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 30  CacheEnabled = 0
0580: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42  ;.#else.static B
0590: 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74 65 33  tShared *sqlite3
05a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
05b0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
05c0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
05d0: 68 65 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  heEnabled = 0;.#
05e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
05f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0600: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0610: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0620: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0630: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0640: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0650: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0660: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0670: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0680: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
0690: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06b0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06c0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06d0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06e0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
06f0: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0700: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0710: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0720: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0730: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0740: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0750: 29 7b 0a 20 20 73 71 6c 69 74 65 33 53 68 61 72  ){.  sqlite3Shar
0760: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0770: 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75 72   enable;.  retur
0780: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
0790: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  endif.../*.** Fo
07a0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
07b0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
07c0: 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42  checkReadLocks(B
07d0: 74 72 65 65 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  tree*,Pgno,BtCur
07e0: 73 6f 72 2a 29 3b 0a 0a 0a 23 69 66 64 65 66 20  sor*);...#ifdef 
07f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0800: 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20  ED_CACHE.  /*.  
0810: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73  ** The functions
0820: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
0830: 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61  ), lockTable() a
0840: 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  nd unlockAllTabl
0850: 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  es().  ** manipu
0860: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0870: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0880: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0890: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
08a0: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
08b0: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
08c0: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
08d0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
08e0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
08f0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0900: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0910: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0920: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0930: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0940: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0950: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0960: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0970: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0980: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0990: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
09a0: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
09b0: 65 66 69 6e 65 20 71 75 65 72 79 54 61 62 6c 65  efine queryTable
09c0: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
09d0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
09e0: 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29  lockTable(a,b,c)
09f0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
0a00: 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  fine unlockAllTa
0a10: 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a  bles(a).#endif..
0a20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0a30: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0a40: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
0a50: 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e  see if btree han
0a60: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
0a70: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
0a80: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
0a90: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0aa0: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
0ab0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
0ac0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
0ad0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
0ae0: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
0af0: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
0b00: 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20  g lockTable()), 
0b10: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  or.** SQLITE_LOC
0b20: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
0b30: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54  tatic int queryT
0b40: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0b50: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0b60: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0b70: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0b80: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0b90: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0ba0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0bb0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 0a 20  Mutex(p) );.  . 
0bc0: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f   /* This is a no
0bd0: 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65  -op if the share
0be0: 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65  d-cache is not e
0bf0: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
0c00: 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  !p->sharable ){.
0c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0c20: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
0c30: 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  If some other co
0c40: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
0c50: 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ing an exclusive
0c60: 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20   lock, the.  ** 
0c70: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d  requested lock m
0c80: 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  ay not be obtain
0c90: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
0ca0: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 26  Bt->pExclusive &
0cb0: 26 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  & pBt->pExclusiv
0cc0: 65 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74 75  e!=p ){.    retu
0cd0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
0ce0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
0cf0: 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63   (along with loc
0d00: 6b 54 61 62 6c 65 28 29 29 20 69 73 20 77 68 65  kTable()) is whe
0d10: 72 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  re the ReadUncom
0d20: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20  mitted flag is. 
0d30: 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20   ** dealt with. 
0d40: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
0d50: 20 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20   querying for a 
0d60: 72 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68  read-lock and th
0d70: 65 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73  e flag is.  ** s
0d80: 65 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64  et, it is uncond
0d90: 69 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65  itionally grante
0da0: 64 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72  d - even if ther
0db0: 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b  e are write-lock
0dc0: 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61  s.  ** on the ta
0dd0: 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ble. If a write-
0de0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
0df0: 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  d, the ReadUncom
0e00: 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a  mitted flag.  **
0e10: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
0e20: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  ed..  **.  ** In
0e30: 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61   function lockTa
0e40: 62 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61 64  ble(), if a read
0e50: 2d 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65  -lock is demande
0e60: 64 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20  d and the .  ** 
0e70: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0e80: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20  flag is set, no 
0e90: 65 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74  entry is added t
0ea0: 6f 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74  o the locks list
0eb0: 20 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64   .  ** (BtShared
0ec0: 2e 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20  .pLock)..  **.  
0ed0: 2a 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a  ** To summarize:
0ee0: 20 49 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f   If the ReadUnco
0ef0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
0f00: 73 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  set, then read c
0f10: 75 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e  ursors do.  ** n
0f20: 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73  ot create or res
0f30: 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73  pect table locks
0f40: 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  . The locking pr
0f50: 6f 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20  ocedure for a . 
0f60: 20 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72   ** write-cursor
0f70: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
0f80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
0f90: 20 20 21 70 2d 3e 64 62 20 7c 7c 20 0a 20 20 20    !p->db || .   
0fa0: 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67   0==(p->db->flag
0fb0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
0fc0: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
0fd0: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
0fe0: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
0ff0: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
1000: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
1010: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1020: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1030: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1040: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
1050: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
1060: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
1070: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
1080: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
1090: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
10a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
10b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
10c0: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
10d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
10f0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
1100: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
1110: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1120: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1130: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
1140: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
1150: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1160: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
1170: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
1180: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
1190: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
11a0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
11b0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
11c0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
11d0: 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
11e0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
11f0: 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64  f the lock is ad
1200: 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
1210: 2e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  . SQLITE_BUSY an
1220: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  d.** SQLITE_NOME
1230: 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65  M may also be re
1240: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1250: 63 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28  c int lockTable(
1260: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
1270: 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29  Table, u8 eLock)
1280: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1290: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
12a0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b  Lock *pLock = 0;
12b0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
12c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
12d0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
12e0: 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20  tex(p) );..  /* 
12f0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1300: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
1310: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
1320: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
1330: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1340: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1350: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1360: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
1370: 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  yTableLock(p, iT
1380: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
1390: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61  .  /* If the rea
13a0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
13b0: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20  ag is set and a 
13c0: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71  read-lock is req
13d0: 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74  uested,.  ** ret
13e0: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75  urn early withou
13f0: 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72  t adding an entr
1400: 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  y to the BtShare
1410: 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65  d.pLock list. Se
1420: 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69  e.  ** comment i
1430: 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79  n function query
1440: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20  TableLock() for 
1450: 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e  more info on han
1460: 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  dling .  ** the 
1470: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
1480: 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  flag..  */.  if(
1490: 20 0a 20 20 20 20 28 70 2d 3e 64 62 29 20 26 26   .    (p->db) &&
14a0: 20 0a 20 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c   .    (p->db->fl
14b0: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
14c0: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a  ncommitted) && .
14d0: 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44      (eLock==READ
14e0: 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54  _LOCK) &&.    iT
14f0: 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f  able!=MASTER_ROO
1500: 54 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  T.  ){.    retur
1510: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1520: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61  ..  /* First sea
1530: 72 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72  rch the list for
1540: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63   an existing loc
1550: 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  k on this table.
1560: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d   */.  for(pIter=
1570: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1580: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1590: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
15a0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
15b0: 54 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e  Table && pIter->
15c0: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
15d0: 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72     pLock = pIter
15e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1600: 66 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72  f the above sear
1610: 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  ch did not find 
1620: 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20  a BtLock struct 
1630: 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65  associating Btre
1640: 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61  e p.  ** with ta
1650: 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f  ble iTable, allo
1660: 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e  cate one and lin
1670: 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  k it into the li
1680: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  st..  */.  if( !
1690: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  pLock ){.    pLo
16a0: 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73  ck = (BtLock *)s
16b0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
16c0: 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29  (sizeof(BtLock))
16d0: 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b  ;.    if( !pLock
16e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1700: 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e     }.    pLock->
1710: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
1720: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  .    pLock->pBtr
1730: 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63  ee = p;.    pLoc
1740: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  k->pNext = pBt->
1750: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
1760: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
1770: 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1780: 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61   BtLock.eLock va
1790: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61  riable to the ma
17a0: 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72  ximum of the cur
17b0: 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61  rent lock.  ** a
17c0: 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
17d0: 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e   lock. This mean
17e0: 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63  s if a write-loc
17f0: 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65  k was already he
1800: 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  ld.  ** and a re
1810: 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65  ad-lock requeste
1820: 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f  d, we don't inco
1830: 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64  rrectly downgrad
1840: 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  e the lock..  */
1850: 0a 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45  .  assert( WRITE
1860: 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20  _LOCK>READ_LOCK 
1870: 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70  );.  if( eLock>p
1880: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20  Lock->eLock ){. 
1890: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
18a0: 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = eLock;.  }..  
18b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18c0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
18d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
18e0: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
18f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1900: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
1910: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74  ** Release all t
1920: 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28  he table locks (
1930: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76  locks obtained v
1940: 69 61 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20  ia calls to the 
1950: 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70  lockTable().** p
1960: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
1970: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
1980: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1990: 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
19a0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
19b0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19c0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
19d0: 2a 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e  *ppIter = &pBt->
19e0: 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74  pLock;..  assert
19f0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1a00: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1a10: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
1a20: 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74  able || 0==*ppIt
1a30: 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  er );..  while( 
1a40: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
1a50: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
1a60: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
1a70: 72 74 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73  rt( pBt->pExclus
1a80: 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  ive==0 || pBt->p
1a90: 45 78 63 6c 75 73 69 76 65 3d 3d 70 4c 6f 63 6b  Exclusive==pLock
1aa0: 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20  ->pBtree );.    
1ab0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1ac0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
1ad0: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
1ae0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
1af0: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
1b00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b10: 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63    ppIter = &pLoc
1b20: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  k->pNext;.    }.
1b30: 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e    }..  if( pBt->
1b40: 70 45 78 63 6c 75 73 69 76 65 3d 3d 70 20 29 7b  pExclusive==p ){
1b50: 0a 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75  .    pBt->pExclu
1b60: 73 69 76 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  sive = 0;.  }.}.
1b70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b80: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1b90: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
1ba0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
1bb0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
1bc0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
1bd0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rence */../*.** 
1be0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1bf0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d  cursor holds a m
1c00: 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
1c10: 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ared.*/.#ifndef 
1c20: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
1c30: 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  t cursorHoldsMut
1c40: 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ex(BtCursor *p){
1c50: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c60: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
1c70: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  pBt->mutex);.}.#
1c80: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
1c90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1ca0: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  BLOB./*.** Inval
1cb0: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
1cc0: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1cd0: 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43  he for cursor pC
1ce0: 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73  ur, if any..*/.s
1cf0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
1d00: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
1d10: 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  he(BtCursor *pCu
1d20: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
1d30: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d40: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
1d50: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
1d60: 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
1d70: 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >aOverflow = 0;.
1d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  }../*.** Invalid
1d90: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
1da0: 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1db0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
1dc0: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68   opened.** on th
1dd0: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
1de0: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
1df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
1e00: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1e10: 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64  owCache(BtShared
1e20: 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
1e30: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
1e40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e50: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e60: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
1e70: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1e80: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76  >pNext){.    inv
1e90: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1ea0: 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23  ache(p);.  }.}.#
1eb0: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69  else.  #define i
1ec0: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
1ed0: 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66  wCache(x).  #def
1ee0: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ine invalidateAl
1ef0: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78  lOverflowCache(x
1f00: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1f10: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
1f20: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1f30: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
1f40: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
1f50: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
1f60: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
1f70: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
1f80: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
1f90: 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69  RESEEK..*/.stati
1fa0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
1fb0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
1fc0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
1fd0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
1fe0: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
1ff0: 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61  r->eState );.  a
2000: 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e  ssert( 0==pCur->
2010: 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  pKey );.  assert
2020: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2030: 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72  ex(pCur) );..  r
2040: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2050: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70  KeySize(pCur, &p
2060: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f  Cur->nKey);..  /
2070: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2080: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
2090: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
20a0: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
20b0: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
20c0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
20d0: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
20e0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
20f0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
2100: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
2110: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
2120: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
2130: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
2140: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
2150: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
2160: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
2170: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
2180: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
2190: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
21a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21b0: 20 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d   0==pCur->pPage-
21c0: 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f  >intKey){.    vo
21d0: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
21e0: 65 33 5f 6d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e  e3_malloc(pCur->
21f0: 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70  nKey);.    if( p
2200: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
2210: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
2220: 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d  y(pCur, 0, pCur-
2230: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
2240: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2250: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2260: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
2270: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
2280: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2290: 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
22a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
22b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
22d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43   }.  assert( !pC
22e0: 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
22f0: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
2300: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
2310: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2320: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
2330: 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  ->pPage);.    pC
2340: 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20  ur->pPage = 0;. 
2350: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2360: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
2370: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
2380: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
2390: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
23a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23b0: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
23c0: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
23d0: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
23e0: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
23f0: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
2400: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
2410: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
2420: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
2430: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
2440: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
2450: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
2460: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
2470: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
2480: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2490: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
24a0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
24b0: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
24c0: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
24d0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
24e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2500: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2510: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
2520: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
2530: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
2540: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
2550: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
2560: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
2570: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
2580: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
2590: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
25a0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
25b0: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
25c0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
25d0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
25e0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
25f0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
2600: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2610: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2620: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2630: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
2640: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
2650: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
2660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2670: 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
2680: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2690: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
26a0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26b0: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
26c0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
26d0: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
26e0: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
26f0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2700: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
2710: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
2720: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
2730: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
2740: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
2750: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
2760: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
2770: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
2780: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
2790: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
27a0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
27b0: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
27c0: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
27d0: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
27e0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
27f0: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
2800: 74 69 76 65 20 72 65 73 74 6f 72 65 4f 72 43 6c  tive restoreOrCl
2810: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2820: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
2830: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
2840: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a  orPosition()..**
2850: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
2860: 64 20 61 72 67 75 6d 65 6e 74 20 61 72 67 75 6d  d argument argum
2870: 65 6e 74 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69  ent - doSeek - i
2880: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  s false, then in
2890: 73 74 65 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74  stead of .** ret
28a0: 75 72 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  urning the curso
28b0: 72 20 74 6f 20 69 74 73 20 73 61 76 65 64 20 70  r to its saved p
28c0: 6f 73 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76  osition, any sav
28d0: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 64  ed position is d
28e0: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  eleted.** and th
28f0: 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 73  e cursor state s
2900: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56  et to CURSOR_INV
2910: 41 4c 49 44 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ALID..*/.int sql
2920: 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65  ite3BtreeRestore
2930: 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
2940: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
2950: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2960: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2970: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2980: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2990: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
29a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
29b0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
29c0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
29d0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
29e0: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
29f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2a00: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2a10: 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
2a20: 72 62 6c 6f 62 48 61 6e 64 6c 65 20 29 7b 0a 20  rblobHandle ){. 
2a30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a40: 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
2a50: 69 66 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  if.  pCur->eStat
2a60: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2a70: 49 44 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ID;.  rc = sqlit
2a80: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2a90: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
2aa0: 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  0, pCur->nKey, 0
2ab0: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a  , &pCur->skip);.
2ac0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ad0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2ae0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
2af0: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
2b00: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
2b10: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2b20: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2b30: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2b40: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2b50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b60: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
2b70: 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
2b80: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
2b90: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
2ba0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2bb0: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73  K ? \.         s
2bc0: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
2bd0: 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2be0: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
2bf0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
2c00: 4b 29 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  K)..#ifndef SQLI
2c10: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c20: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
2c30: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2c40: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
2c50: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
2c60: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2c70: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
2c80: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
2c90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
2ca0: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
2cb0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
2cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
2cd0: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
2ce0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
2cf0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
2d00: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 2c  PagesPerMapPage,
2d10: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
2d20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2d40: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
2d50: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
2d60: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
2d70: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
2d80: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
2d90: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
2da0: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
2db0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
2dc0: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
2dd0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2de0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
2df0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
2e00: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
2e10: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
2e20: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
2e30: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
2e40: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
2e50: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
2e60: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
2e70: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
2e80: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
2e90: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
2ea0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
2eb0: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
2ec0: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
2ed0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ee0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
2ef0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
2f00: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
2f10: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
2f20: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
2f30: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
2f40: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
2f50: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
2f60: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
2f70: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
2f80: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
2f90: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
2fa0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
2fb0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
2fc0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
2fd0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
2fe0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
2ff0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
3000: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
3010: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
3020: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
3030: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3040: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3050: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
3060: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
3070: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
3080: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
3090: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
30a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
30b0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
30c0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
30d0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
30e0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
30f0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
3100: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
3110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
3120: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
3130: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
3140: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
3150: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
3160: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
3170: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
3180: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
3190: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31a0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
31b0: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
31c0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
31d0: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  SET(pBt, key);. 
31e0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
31f0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
3200: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
3210: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
3220: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
3230: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
3240: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
3250: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
3260: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
3270: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
3280: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
3290: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
32a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32b0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
32c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
32e0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
32f0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
3300: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3310: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
3320: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
3330: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
3340: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
3350: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3360: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
3370: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
3380: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
3390: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
33a0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
33b0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
33c0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
33d0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
33e0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
33f0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
3400: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
3410: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
3420: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
3430: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
3440: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
3450: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
3460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3470: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
3480: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
3490: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
34a0: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
34b0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
34c0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
34d0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
34e0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
34f0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
3500: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
3510: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
3520: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
3530: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
3540: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3550: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
3560: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
3570: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
3580: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3590: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35a0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
35b0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
35c0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
35d0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
35e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
35f0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
3600: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
3610: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
3620: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
3630: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
3640: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
3650: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
3660: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
3670: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42  MAP_PTROFFSET(pB
3680: 74 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72  t, key);.  asser
3690: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
36a0: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
36b0: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
36c0: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
36d0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
36e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
36f0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
3700: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
3710: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
3720: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
3730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
3740: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
3750: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3760: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3770: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
3780: 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  UUM */../*.** Gi
3790: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
37a0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
37b0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
37c0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
37d0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
37e0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
37f0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
3800: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
3810: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
3820: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
3830: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
3840: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
3850: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
3860: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
3870: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
3880: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
3890: 20 69 43 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50   iCell) \.  ((pP
38a0: 61 67 65 29 2d 3e 61 44 61 74 61 20 2b 20 67 65  age)->aData + ge
38b0: 74 32 62 79 74 65 28 26 28 70 50 61 67 65 29 2d  t2byte(&(pPage)-
38c0: 3e 61 44 61 74 61 5b 28 70 50 61 67 65 29 2d 3e  >aData[(pPage)->
38d0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43  cellOffset+2*(iC
38e0: 65 6c 6c 29 5d 29 29 0a 23 69 66 64 65 66 20 53  ell)])).#ifdef S
38f0: 51 4c 49 54 45 5f 54 45 53 54 0a 75 38 20 2a 73  QLITE_TEST.u8 *s
3900: 71 6c 69 74 65 33 42 74 72 65 65 46 69 6e 64 43  qlite3BtreeFindC
3910: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
3920: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
3930: 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3e    assert( iCell>
3940: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3950: 69 43 65 6c 6c 3c 67 65 74 32 62 79 74 65 28 26  iCell<get2byte(&
3960: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
3970: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
3980: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 69  ) );.  return fi
3990: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
39a0: 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ell);.}.#endif..
39b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
39c0: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
39d0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  n of sqlite3Btre
39e0: 65 46 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74  eFindCell() that
39f0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
3a00: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
3a10: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
3a20: 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a  ls.  See insert.
3a30: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
3a40: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
3a50: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
3a60: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
3a70: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
3a80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3a90: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
3aa0: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
3ab0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
3ac0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
3ad0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
3ae0: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
3af0: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
3b00: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
3b10: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
3b20: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
3b30: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
3b40: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
3b50: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3b60: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
3b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
3b80: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
3b90: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
3ba0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
3bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
3bc0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
3bd0: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
3be0: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
3bf0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
3c00: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
3c10: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
3c20: 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42  ction.  sqlite3B
3c30: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
3c40: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
3c50: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
3c60: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
3c70: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
3c80: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
3c90: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
3ca0: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
3cb0: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
3cc0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
3cd0: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
3ce0: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
3cf0: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
3d00: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
3d10: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  tead of.** sqlit
3d20: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3d30: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
3d40: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
3d50: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
3d60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3d70: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
3d80: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
3d90: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
3da0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
3db0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
3dc0: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
3dd0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3de0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
3df0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
3e00: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
3e10: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
3e20: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
3e30: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
3e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3e50: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
3e60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
3e70: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
3e80: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
3e90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
3ea0: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
3eb0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
3ec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3ed0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
3ee0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
3ef0: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
3f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
3f10: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
3f20: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
3f30: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
3f40: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
3f50: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
3f60: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
3f70: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
3f80: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  ){.    n += getV
3f90: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
3fa0: 5d 2c 20 26 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  ], &nPayload);. 
3fb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
3fc0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  load = 0;.  }.  
3fd0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e  pInfo->nData = n
3fe0: 50 61 79 6c 6f 61 64 3b 0a 20 20 69 66 28 20 70  Payload;.  if( p
3ff0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
4000: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
4010: 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75  nt(&pCell[n], (u
4020: 36 34 20 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  64 *)&pInfo->nKe
4030: 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
4040: 20 75 33 32 20 78 3b 0a 20 20 20 20 6e 20 2b 3d   u32 x;.    n +=
4050: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
4060: 65 6c 6c 5b 6e 5d 2c 20 26 78 29 3b 0a 20 20 20  ell[n], &x);.   
4070: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 78   pInfo->nKey = x
4080: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  ;.    nPayload +
4090: 3d 20 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  = x;.  }.  pInfo
40a0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
40b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
40c0: 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69  nHeader = n;.  i
40d0: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
40e0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
40f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
4100: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
4110: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
4120: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
4130: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
4140: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
4150: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
4160: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
4170: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
4180: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
4190: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
41a0: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
41b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
41c0: 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  al = nPayload;. 
41d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
41e0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 6e 53 69  low = 0;.    nSi
41f0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
4200: 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  n;.    if( nSize
4210: 3c 34 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  <4 ){.      nSiz
4220: 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a  e = 4;        /*
4230: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
4240: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d  ze is 4 */.    }
4250: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
4260: 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  e = nSize;.  }el
4270: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
4280: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
4290: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
42a0: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
42b0: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
42c0: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
42d0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
42e0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
42f0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
4300: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
4310: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
4320: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
4330: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
4340: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
4350: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
4360: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
4370: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
4380: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
4390: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
43a0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
43b0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
43c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
43d0: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
43e0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
43f0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
4400: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
4410: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
4420: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
4430: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
4440: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
4450: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
4460: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
4470: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
4480: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
4490: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
44a0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
44b0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
44c0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
44d0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
44e0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
44f0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
4500: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
4510: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
4520: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
4530: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
4540: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
4550: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
4560: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
4570: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
4580: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
4590: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
45a0: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
45b0: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
45c0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
45d0: 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20  al = surplus;.  
45e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
45f0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d  Info->nLocal = m
4600: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
4610: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
4620: 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  low = pInfo->nLo
4630: 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  cal + n;.    pIn
4640: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
4650: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
4660: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
4670: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
4680: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c   iCell, pInfo) \
4690: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
46a0: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
46b0: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
46c0: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
46d0: 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73   (pInfo)).void s
46e0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
46f0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
4700: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
4710: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
4720: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
4730: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
4740: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4750: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
4760: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
4770: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
4780: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
4790: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
47a0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
47b0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
47c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
47d0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
47e0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
47f0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
4800: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
4810: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
4820: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
4830: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
4840: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
4850: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
4860: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
4870: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
4880: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
4890: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
48a0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
48b0: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
48c0: 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  er..*/.#ifndef N
48d0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36  DEBUG.static u16
48e0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
48f0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
4900: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
4910: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
4920: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
4930: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e  Page, iCell, &in
4940: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
4950: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  fo.nSize;.}.#end
4960: 69 66 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  if.static u16 ce
4970: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
4980: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
4990: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
49a0: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
49b0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
49c0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
49d0: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
49e0: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a   info.nSize;.}..
49f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4a00: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
4a10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
4a20: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
4a30: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
4a40: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
4a50: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
4a60: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
4a70: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
4a80: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
4a90: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
4aa0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
4ab0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
4ac0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4ad0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4ae0: 20 20 69 66 28 20 70 43 65 6c 6c 20 29 7b 0a 20    if( pCell ){. 
4af0: 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
4b00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
4b10: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
4b20: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
4b30: 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
4b40: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
4b50: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
4b60: 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
4b70: 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
4b80: 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
4b90: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
4ba0: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
4bb0: 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
4bc0: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
4bd0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
4be0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
4bf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 74 72        return ptr
4c00: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
4c10: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
4c20: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
4c30: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  ->pgno);.    }. 
4c40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4c50: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
4c60: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
4c70: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
4c80: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
4c90: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
4ca0: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
4cb0: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
4cc0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
4cd0: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
4ce0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
4cf0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
4d00: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
4d10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4d20: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
4d30: 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72   *pCell;.  asser
4d40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4d50: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
4d60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43  ->mutex) );.  pC
4d70: 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ell = findOverfl
4d80: 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  owCell(pPage, iC
4d90: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ell);.  return p
4da0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
4db0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d  pPage, pCell);.}
4dc0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4dd0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
4de0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
4df0: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
4e00: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
4e10: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
4e20: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
4e30: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
4e40: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
4e50: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
4e60: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
4e70: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
4e80: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
4e90: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
4ea0: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
4eb0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
4ec0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
4ed0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
4f00: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4f30: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
4f40: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4f60: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
4f70: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
4f80: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
4f90: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4fb0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
4fc0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
4fd0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4ff0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
5000: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
5010: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5020: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
5030: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
5040: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
5050: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
5060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
5070: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
5080: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
5090: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
50a0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
50b0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
50c0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
50d0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
50e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
50f0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
5100: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
5110: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
5120: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
5130: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
5140: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
5150: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
5160: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
5170: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
5180: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
5190: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
51a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
51b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
51c0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
51d0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
51e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
51f0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
5200: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
5210: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
5220: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
5230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5240: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5250: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
5260: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
5270: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
5280: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
5290: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
52a0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
52b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
52c0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
52d0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
52e0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
52f0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
5300: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
5310: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
5320: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
5330: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
5340: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72  usableSize;.  br
5350: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
5360: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
5370: 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c  mcpy(&temp[brk],
5380: 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61   &data[brk], usa
5390: 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a  bleSize - brk);.
53a0: 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69    brk = usableSi
53b0: 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ze;.  for(i=0; i
53c0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
53d0: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
53e0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
53f0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
5400: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
5410: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
5420: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
5430: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
5440: 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67 65  assert( pc<pPage
5450: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5460: 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  e );.    size = 
5470: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
5480: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
5490: 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a     brk -= size;.
54a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
54b0: 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  [brk], &temp[pc]
54c0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
54d0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72 6b  2byte(pAddr, brk
54e0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
54f0: 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74   brk>=cellOffset
5500: 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75  +2*nCell );.  pu
5510: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5520: 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74  +5], brk);.  dat
5530: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
5540: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
5550: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
5560: 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c   0;.  addr = cel
5570: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
5580: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
5590: 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64  addr], 0, brk-ad
55a0: 64 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  dr);.  return SQ
55b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
55c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
55d0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
55e0: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
55f0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
5600: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
5610: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
5620: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
5630: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
5640: 2e 20 4f 72 20 72 65 74 75 72 6e 20 30 20 69 66  . Or return 0 if
5650: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e   there is not en
5660: 6f 75 67 68 20 66 72 65 65 0a 2a 2a 20 73 70 61  ough free.** spa
5670: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ce on the page t
5680: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 61 6c  o satisfy the al
5690: 6c 6f 63 61 74 69 6f 6e 20 72 65 71 75 65 73 74  location request
56a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
56b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79  age contains nBy
56c0: 74 65 73 20 6f 66 20 66 72 65 65 20 73 70 61 63  tes of free spac
56d0: 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  e but does not c
56e0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73  ontain.** nBytes
56f0: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66   of contiguous f
5700: 72 65 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20  ree space, then 
5710: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74  this routine aut
5720: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61  omatically.** ca
5730: 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50  lls defragementP
5740: 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69  age() to consoli
5750: 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70  date all free sp
5760: 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61  ace before .** a
5770: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65  llocating the ne
5780: 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74  w chunk..*/.stat
5790: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
57a0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
57b0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  age, int nByte){
57c0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c  .  int addr, pc,
57d0: 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65   hdr;.  int size
57e0: 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20  ;.  int nFrag;. 
57f0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20   int top;.  int 
5800: 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c  nCell;.  int cel
5810: 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  lOffset;.  unsig
5820: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
5830: 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67    .  data = pPag
5840: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65  e->aData;.  asse
5850: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
5860: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
5870: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
5880: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
5890: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
58a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
58b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
58c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
58d0: 6e 42 79 74 65 3c 34 20 29 20 6e 42 79 74 65 20  nByte<4 ) nByte 
58e0: 3d 20 34 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 4;.  if( pPage
58f0: 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65 20 7c 7c  ->nFree<nByte ||
5900: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
5910: 77 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  w>0 ) return 0;.
5920: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
5930: 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d  = nByte;.  hdr =
5940: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
5950: 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61  t;..  nFrag = da
5960: 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28  ta[hdr+7];.  if(
5970: 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20   nFrag<60 ){.   
5980: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66   /* Search the f
5990: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
59a0: 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65  for a slot big e
59b0: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
59c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63   the.    ** spac
59d0: 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20  e request. */.  
59e0: 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a    addr = hdr+1;.
59f0: 20 20 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d      while( (pc =
5a00: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5a10: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
5a20: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
5a30: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
5a40: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
5a50: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
5a60: 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65    if( size<nByte
5a70: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +4 ){.          
5a80: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64  memcpy(&data[add
5a90: 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32  r], &data[pc], 2
5aa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  );.          dat
5ab0: 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67  a[hdr+7] = nFrag
5ac0: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5ad0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ae0: 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  n pc;.        }e
5af0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
5b00: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
5b10: 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29  +2], size-nByte)
5b20: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
5b30: 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e  rn pc + size - n
5b40: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Byte;.        }.
5b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64        }.      ad
5b60: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20  dr = pc;.    }. 
5b70: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
5b80: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
5b90: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
5ba0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
5bb0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
5bc0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
5bd0: 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74  t area..  */.  t
5be0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
5bf0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e  ata[hdr+5]);.  n
5c00: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
5c10: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
5c20: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
5c30: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
5c40: 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30  .  if( nFrag>=60
5c50: 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b   || cellOffset +
5c60: 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d   2*nCell > top -
5c70: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 69 66   nByte ){.    if
5c80: 28 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  ( defragmentPage
5c90: 28 70 50 61 67 65 29 20 29 20 72 65 74 75 72 6e  (pPage) ) return
5ca0: 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65   0;.    top = ge
5cb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5cc0: 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20  +5]);.  }.  top 
5cd0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65  -= nByte;.  asse
5ce0: 72 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  rt( cellOffset +
5cf0: 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20   2*nCell <= top 
5d00: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
5d10: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
5d20: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
5d30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5d40: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
5d50: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
5d60: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
5d70: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
5d80: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
5d90: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
5da0: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
5db0: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
5dc0: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
5dd0: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
5de0: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
5df0: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
5e00: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
5e10: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
5e20: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
5e30: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
5e40: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
5e50: 69 63 20 76 6f 69 64 20 66 72 65 65 53 70 61 63  ic void freeSpac
5e60: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
5e70: 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74  , int start, int
5e80: 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64   size){.  int ad
5e90: 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b  dr, pbegin, hdr;
5ea0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5eb0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
5ec0: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
5ed0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
5ee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
5ef0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
5f00: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
5f10: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
5f20: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
5f30: 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61  hdrOffset+6+(pPa
5f40: 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b  ge->leaf?0:4) );
5f50: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
5f60: 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65  t + size)<=pPage
5f70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5f80: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
5f90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5fa0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
5fb0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 73 69  tex) );.  if( si
5fc0: 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b  ze<4 ) size = 4;
5fd0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5fe0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
5ff0: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
6000: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
6010: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
6020: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
6030: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
6040: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
6050: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
6060: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
6070: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
6080: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
6090: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
60a0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
60b0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
60c0: 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61  s */.  hdr = pPa
60d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
60e0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
60f0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
6100: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6110: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
6120: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
6130: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6140: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
6150: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
6160: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
6170: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
6180: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
6190: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  }.  assert( pbeg
61a0: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
61b0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
61c0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
61d0: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
61e0: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
61f0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
6200: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
6210: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
6220: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
6230: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
6240: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
6250: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65  e->nFree += size
6260: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
6270: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
6280: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
6290: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
62a0: 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  et + 1;.  while(
62b0: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
62c0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
62d0: 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  )>0 ){.    int p
62e0: 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20  next, psize;.   
62f0: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
6300: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  addr );.    asse
6310: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
6320: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6330: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
6340: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
6350: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
6360: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
6370: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
6380: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
6390: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
63a0: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
63b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
63c0: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
63d0: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
63e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72 61       assert( fra
63f0: 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  g<=data[pPage->h
6400: 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20  drOffset+7] );. 
6410: 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d       data[pPage-
6420: 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d  >hdrOffset+7] -=
6430: 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74   frag;.      put
6440: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
6450: 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64  in], get2byte(&d
6460: 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20  ata[pnext]));.  
6470: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
6480: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e  ta[pbegin+2], pn
6490: 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64 61  ext+get2byte(&da
64a0: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65  ta[pnext+2])-pbe
64b0: 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gin);.    }else{
64c0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
64d0: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
64e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
64f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
6500: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
6510: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
6520: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
6530: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
6540: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
6550: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
6560: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
6570: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
6580: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6590: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
65a0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
65b0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
65c0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
65d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
65e0: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
65f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
6600: 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  op + get2byte(&d
6610: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b  ata[pbegin+2]));
6620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
6630: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
6640: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
6650: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
6660: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
6670: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
6680: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
6690: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
66a0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
66b0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f  static void deco
66c0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
66d0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
66e0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
66f0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
6700: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
6710: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
6720: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
6730: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
6740: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
6750: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6760: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6770: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6780: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e  ) );.  pPage->in
6790: 74 4b 65 79 20 3d 20 28 66 6c 61 67 42 79 74 65  tKey = (flagByte
67a0: 20 26 20 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50   & (PTF_INTKEY|P
67b0: 54 46 5f 4c 45 41 46 44 41 54 41 29 29 21 3d 30  TF_LEAFDATA))!=0
67c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44  ;.  pPage->zeroD
67d0: 61 74 61 20 3d 20 28 66 6c 61 67 42 79 74 65 20  ata = (flagByte 
67e0: 26 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 21  & PTF_ZERODATA)!
67f0: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61  =0;.  pPage->lea
6800: 66 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  f = (flagByte & 
6810: 50 54 46 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20  PTF_LEAF)!=0;.  
6820: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
6830: 69 7a 65 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e  ize = 4*(pPage->
6840: 6c 65 61 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20  leaf==0);.  pBt 
6850: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
6860: 69 66 28 20 66 6c 61 67 42 79 74 65 20 26 20 50  if( flagByte & P
6870: 54 46 5f 4c 45 41 46 44 41 54 41 20 29 7b 0a 20  TF_LEAFDATA ){. 
6880: 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
6890: 74 61 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ta = 1;.    pPag
68a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
68b0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
68c0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
68d0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
68e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
68f0: 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20 30  ge->leafData = 0
6900: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
6910: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
6920: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
6930: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6940: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->minLocal;.  }.
6950: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
6960: 20 3d 20 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f   = !(pPage->zero
6970: 44 61 74 61 20 7c 7c 20 28 21 70 50 61 67 65 2d  Data || (!pPage-
6980: 3e 6c 65 61 66 20 26 26 20 70 50 61 67 65 2d 3e  >leaf && pPage->
6990: 6c 65 61 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f  leafData));.}../
69a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
69b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
69c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
69d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
69e0: 2a 20 54 68 65 20 70 50 61 72 65 6e 74 20 70 61  * The pParent pa
69f0: 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20  rameter must be 
6a00: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6a10: 20 4d 65 6d 50 61 67 65 20 77 68 69 63 68 0a 2a   MemPage which.*
6a20: 2a 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20  * is the parent 
6a30: 6f 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  of the page bein
6a40: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  g initialized.  
6a50: 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a  The root of a.**
6a60: 20 42 54 72 65 65 20 68 61 73 20 6e 6f 20 70 61   BTree has no pa
6a70: 72 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72 20  rent and so for 
6a80: 74 68 61 74 20 70 61 67 65 2c 20 70 50 61 72 65  that page, pPare
6a90: 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  nt==NULL..**.** 
6aa0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
6ab0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
6ac0: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
6ad0: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
6ae0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
6af0: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
6b00: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
6b10: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
6b20: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
6b30: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
6b40: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
6b50: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
6b60: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
6b70: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
6b80: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
6b90: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
6ba0: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
6bb0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ption..*/.int sq
6bc0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
6bd0: 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
6be0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
6bf0: 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 69  The page to be i
6c00: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
6c10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
6c20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
6c30: 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  rent.  Might be 
6c40: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
6c50: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
6c60: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
6c70: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
6c80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
6c90: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
6ca0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
6cb0: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
6cc0: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
6cd0: 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
6ce0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
6cf0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
6d00: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
6d10: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
6d20: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
6d30: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75  cture */.  int u
6d40: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
6d50: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
6d60: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
6d70: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
6d80: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
6d90: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
6da0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
6db0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
6dc0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
6dd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6de0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
6df0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
6e00: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
6e10: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
6e20: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
6e30: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
6e40: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
6e50: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
6e60: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
6e70: 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c  t( pParent==0 ||
6e80: 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70   pParent->pBt==p
6e90: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
6ea0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6eb0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6ed0: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
6ee0: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
6ef0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
6f00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6f10: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
6f20: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
6f30: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6f40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
6f50: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
6f60: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
6f70: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
6f80: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
6f90: 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26 20  ent!=pParent && 
6fa0: 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21  (pPage->pParent!
6fb0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73 49  =0 || pPage->isI
6fc0: 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nit) ){.    /* T
6fd0: 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  he parent page s
6fe0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61 6e  hould never chan
6ff0: 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  ge unless the fi
7000: 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a 2f  le is corrupt */
7010: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7020: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7030: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7040: 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  ->isInit ) retur
7050: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
7060: 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
7070: 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21  t==0 && pParent!
7080: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  =0 ){.    pPage-
7090: 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65  >pParent = pPare
70a0: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  nt;.    sqlite3P
70b0: 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
70c0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  >pDbPage);.  }. 
70d0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
70e0: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
70f0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
7100: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7110: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 3b  age, data[hdr]);
7120: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
7130: 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  low = 0;.  pPage
7140: 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
7150: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
7160: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
7170: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
7180: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
7190: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
71a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 74  pPage->leaf;.  t
71b0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
71c0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 70  ata[hdr+5]);.  p
71d0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
71e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
71f0: 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67  +3]);.  if( pPag
7200: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
7210: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
7220: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
7230: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
7240: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
7250: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
7260: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7270: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7280: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  }.  if( pPage->n
7290: 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
72a0: 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt!=0 && pParent
72b0: 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
72c0: 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d 75   /* All pages mu
72d0: 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  st have at least
72e0: 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65 70   one cell, excep
72f0: 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65 73  t for root pages
7300: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
7310: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7320: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  PT;.  }..  /* Co
7330: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
7340: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
7350: 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20 3d  e page */.  pc =
7360: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7370: 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
7380: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
7390: 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66 73   top - (cellOffs
73a0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
73b0: 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ell);.  while( p
73c0: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  c>0 ){.    int n
73d0: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
73e0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
73f0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  -4 ){.      /* F
7400: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
7410: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
7420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7430: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
7440: 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20 3d      }.    next =
7450: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7460: 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  pc]);.    size =
7470: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7480: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
7490: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
74a0: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
74b0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
74c0: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63  s must be in acc
74d0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
74e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
74f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7500: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46 72  ; .    }.    nFr
7510: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20  ee += size;.    
7520: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a 20  pc = next;.  }. 
7530: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
7540: 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46 72  nFree;.  if( nFr
7550: 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ee>=usableSize )
7560: 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73 70  {.    /* Free sp
7570: 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ace cannot excee
7580: 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69 7a  d total page siz
7590: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
75a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
75b0: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 70 50 61  KPT; .  }..  pPa
75c0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
75d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
75e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
75f0: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
7600: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
7610: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
7620: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
7630: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
7640: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
7650: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
7660: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
7670: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7680: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
7690: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
76a0: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
76b0: 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20  Bt;.  int hdr = 
76c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
76d0: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a  ;.  int first;..
76e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
76f0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
7700: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7710: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
7720: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7730: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
7740: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7750: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
7760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7770: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7780: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7790: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
77a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
77b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
77c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
77d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
77e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
77f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d  t->mutex) );.  m
7800: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
7810: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
7820: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64  Size - hdr);.  d
7830: 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73  ata[hdr] = flags
7840: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
7850: 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26  + 8 + 4*((flags&
7860: 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20  PTF_LEAF)==0);. 
7870: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
7880: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
7890: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
78a0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
78b0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
78c0: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
78d0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
78e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
78f0: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
7900: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
7910: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
7920: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
7930: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
7940: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
7950: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
7960: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
7970: 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ft = 0;.  pPage-
7980: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
7990: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
79a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
79b0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
79c0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
79d0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
79e0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
79f0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
7a00: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
7a10: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
7a20: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
7a30: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
7a40: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
7a50: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
7a60: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
7a70: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
7a80: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
7a90: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
7aa0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
7ab0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
7ac0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
7ad0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
7ae0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
7af0: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
7b00: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
7b10: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
7b20: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
7b30: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
7b40: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
7b50: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
7b60: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
7b70: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
7b80: 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
7b90: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
7ba0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
7bb0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
7bc0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
7bd0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
7be0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
7bf0: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
7c00: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
7c10: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
7c20: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
7c30: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
7c40: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
7c50: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7c60: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
7c70: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
7c80: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
7c90: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
7ca0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
7cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7cc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7cd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7cf0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
7d00: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
7d10: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
7d20: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
7d30: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7d40: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
7d50: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
7d60: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
7d70: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
7d80: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
7d90: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7da0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
7db0: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
7dc0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
7dd0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
7de0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
7df0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
7e00: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
7e10: 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50   100 : 0;.  *ppP
7e20: 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72  age = pPage;.  r
7e30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
7e50: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
7e60: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
7e70: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
7e80: 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20  tine.** is just 
7e90: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
7ea0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
7eb0: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  arate calls to.*
7ec0: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  * sqlite3BtreeGe
7ed0: 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69  tPage() and sqli
7ee0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
7ef0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
7f00: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
7f10: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
7f20: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
7f30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7f40: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7f60: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
7f70: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
7f80: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
7f90: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
7fa0: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
7fb0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
7fc0: 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61  Parent     /* Pa
7fd0: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
7fe0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7ff0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8000: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8010: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
8020: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
8030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8040: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
8050: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
8060: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
8070: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
8080: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
8090: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
80a0: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
80b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
80c0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
80d0: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
80e0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
80f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
8100: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
8110: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
8120: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
8130: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
8140: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
8150: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
8160: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
8170: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
8180: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
8190: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
81a0: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
81b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
81c0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
81d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
81e0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
81f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
8200: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
8210: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
8220: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8230: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
8240: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
8250: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
8260: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8270: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8280: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
8290: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
82a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
82b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
82c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
82d0: 65 64 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ed when the refe
82e0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
82f0: 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65  a page.** reache
8300: 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64  s zero.  We need
8310: 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50   to unref the pP
8320: 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68  arent pointer wh
8330: 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65  en that.** happe
8340: 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
8350: 69 64 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  id pageDestructo
8360: 72 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  r(DbPage *pData,
8370: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
8380: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8390: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
83a0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
83b0: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
83c0: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
83d0: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
83e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
83f0: 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ge->isInit==0 ||
8400: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8410: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8420: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8430: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29  pPage->pParent )
8440: 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
8450: 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
8460: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 61 73 73  pParent;.    ass
8470: 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 42  ert( pParent->pB
8480: 74 3d 3d 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t==pPage->pBt );
8490: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
84a0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ent = 0;.    rel
84b0: 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74  easePage(pParent
84c0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
84d0: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  isInit = 0;.}../
84e0: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
84f0: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
8500: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
8510: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
8520: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
8530: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
8540: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
8550: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
8560: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
8570: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
8580: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
8590: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
85a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
85b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
85c0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
85d0: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
85e0: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
85f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
8600: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
8610: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
8620: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
8630: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
8640: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  t(DbPage *pData,
8650: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
8660: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8670: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
8680: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
8690: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
86a0: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
86b0: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
86c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
86d0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
86e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
86f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8700: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8710: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
8720: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8730: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
8740: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
8750: 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rent);.  }.}../*
8760: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
8770: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
8780: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
8790: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74  ic int sqlite3Bt
87a0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
87b0: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c  dler(void *pArg,
87c0: 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61   int n){.  BtSha
87d0: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
87e0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
87f0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
8800: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8810: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8820: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
8830: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8840: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
8850: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
8860: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
8870: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
8880: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
8890: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
88a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
88b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
88c0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
88d0: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
88e0: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
88f0: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
8900: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
8910: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
8920: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
8930: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
8940: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
8950: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
8960: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
8970: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
8980: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
8990: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
89a0: 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
89b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
89c0: 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
89d0: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
89e0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
89f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8a00: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
8a10: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
8a20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
8a30: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
8a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
8a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
8a60: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
8a70: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
8a80: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
8a90: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8aa0: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
8ab0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
8ac0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ae0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
8af0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
8b00: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
8b10: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
8b20: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
8b30: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
8b40: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
8b50: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
8b60: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
8b70: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
8b80: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
8b90: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
8ba0: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
8bb0: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
8bc0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
8bd0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
8be0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
8bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8c00: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20   int nReserve;. 
8c10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
8c20: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a  DbHeader[100];..
8c30: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
8c40: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
8c50: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
8c60: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
8c70: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
8c80: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
8c90: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
8ca0: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
8cb0: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
8cc0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
8cd0: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
8ce0: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
8cf0: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
8d00: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
8d10: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
8d20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8d30: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
8d40: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
8d50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8d60: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
8d70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
8d80: 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  YDB.    const in
8d90: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20  t isMemdb = 0;. 
8da0: 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74   #else.    const
8db0: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a   int isMemdb = z
8dc0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72  Filename && !str
8dd0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
8de0: 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65  :memory:");.  #e
8df0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ndif.#endif..  a
8e00: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
8e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8e20: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8e30: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56  >mutex) );..  pV
8e40: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
8e50: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
8e60: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
8e70: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
8e80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8e90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8ea0: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
8eb0: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
8ec0: 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64  db = db;..#if !d
8ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8ee0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
8ef0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
8f00: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
8f10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
8f20: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
8f30: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
8f40: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
8f50: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
8f60: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
8f70: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
8f80: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
8f90: 2a 2f 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  */.  if( (flags 
8fa0: 26 20 42 54 52 45 45 5f 50 52 49 56 41 54 45 29  & BTREE_PRIVATE)
8fb0: 3d 3d 30 0a 20 20 20 26 26 20 69 73 4d 65 6d 64  ==0.   && isMemd
8fc0: 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e  b==0.   && (db->
8fd0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
8fe0: 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46  tab)==0.   && zF
8ff0: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
9000: 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20  name[0].  ){.   
9010: 20 69 66 28 20 73 71 6c 69 74 65 33 53 68 61 72   if( sqlite3Shar
9020: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
9030: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
9040: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
9050: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
9060: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
9070: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 28 63 68 61  lPathname = (cha
9080: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
9090: 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  oc(nFullPathname
90a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
90b0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
90c0: 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  red;.      p->sh
90d0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
90e0: 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20    if( db ){.    
90f0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
9100: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
9110: 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  che;.      }.   
9120: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
9130: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
9140: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9150: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9160: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9180: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
9190: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
91a0: 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  me, nFullPathnam
91b0: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
91c0: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
91d0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  ared = sqlite3_m
91e0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
91f0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
9200: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
9210: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9220: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
9230: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 73 71        for(pBt=sq
9240: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
9250: 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d 70  List; pBt; pBt=p
9260: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
9270: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
9280: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
9290: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
92a0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
92b0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
92c0: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
92d0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
92e0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
92f0: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
9300: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
9310: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
9320: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
9330: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
9340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9360: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
9370: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
9380: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
9390: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
93a0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
93b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
93c0: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
93d0: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
93e0: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
93f0: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
9400: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
9410: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
9420: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
9430: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
9440: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
9450: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
9460: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
9470: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
9480: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
9490: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
94a0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
94b0: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
94c0: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
94d0: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
94e0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
94f0: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
9500: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
9510: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
9520: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
9530: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
9540: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
9550: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
9560: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
9570: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
9580: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
9590: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
95a0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
95b0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
95c0: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
95d0: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
95e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
95f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
9600: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
9610: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
9620: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
9630: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
9640: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
9650: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
9660: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
9670: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
9680: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
9690: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
96a0: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
96b0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
96c0: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
96d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
96e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
96f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9700: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
9710: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
9720: 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64 72      pBt->busyHdr
9730: 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  .xFunc = sqlite3
9740: 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  BtreeInvokeBusyH
9750: 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42 74 2d  andler;.    pBt-
9760: 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20 3d 20  >busyHdr.pArg = 
9770: 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  pBt;.    rc = sq
9780: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
9790: 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
97a0: 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49          EXTRA_SI
97d0: 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  ZE, flags, vfsFl
97e0: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
97f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9800: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9810: 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
9820: 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
9830: 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
9840: 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
9850: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
9860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9870: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
9880: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
9890: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
98a0: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
98b0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
98c0: 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20 20 70  >busyHdr);.    p
98d0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
98e0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
98f0: 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70 42  SetDestructor(pB
9900: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 44  t->pPager, pageD
9910: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
9920: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
9930: 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61  einiter(pBt->pPa
9940: 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ger, pageReinit)
9950: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73  ;.    pBt->pCurs
9960: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
9970: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
9980: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
9990: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
99a0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
99b0: 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ger);.    pBt->p
99c0: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
99d0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36  te(&zDbHeader[16
99e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ]);.    if( pBt-
99f0: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
9a00: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
9a10: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
9a20: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
9a30: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
9a40: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
9a50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
9a60: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
9a70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
9a80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
9a90: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9aa0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9ab0: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
9ac0: 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a 20  Frac = 64;   /* 
9ad0: 32 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42 74  25% */.      pBt
9ae0: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
9af0: 20 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20   32;   /* 12.5% 
9b00: 2a 2f 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69  */.      pBt->mi
9b10: 6e 4c 65 61 66 46 72 61 63 20 3d 20 33 32 3b 20  nLeafFrac = 32; 
9b20: 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23     /* 12.5% */.#
9b30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9b40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
9b50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
9b60: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
9b70: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
9b80: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
9b90: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
9ba0: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
9bb0: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
9bc0: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
9bd0: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
9be0: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
9bf0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
9c00: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
9c10: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
9c20: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
9c30: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9c40: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
9c50: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
9c60: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
9c70: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
9c80: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
9c90: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
9ca0: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
9cb0: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
9cc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9cd0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
9ce0: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
9cf0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
9d00: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
9d10: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
9d20: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
9d30: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
9d40: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
9d50: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
9d60: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
9d70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
9d80: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
9d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
9da0: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
9db0: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
9dc0: 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63  Bt->maxEmbedFrac
9dd0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31 5d   = zDbHeader[21]
9de0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e  ;.      pBt->min
9df0: 45 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48  EmbedFrac = zDbH
9e00: 65 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 20  eader[22];.     
9e10: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
9e20: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 33  c = zDbHeader[23
9e30: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
9e40: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
9e50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9e60: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
9e70: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
9e80: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
9e90: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
9ea0: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
9eb0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
9ec0: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
9ed0: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
9ee0: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
9ef0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  if.    }.    pBt
9f00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
9f10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
9f20: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
9f30: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
9f40: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
9f50: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
9f60: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
9f70: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
9f80: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
9f90: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9fa0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9fb0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9fc0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9fd0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
9fe0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9ff0: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
a000: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
a010: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
a020: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
a030: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
a040: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a050: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
a060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a070: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
a080: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
a090: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
a0a0: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
a0b0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
a0c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
a0d0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
a0e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
a0f0: 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
a100: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
a110: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
a120: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a130: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
a140: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
a150: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
a160: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a170: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
a180: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
a190: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
a1a0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
a1b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a1c0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a1d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
a1e0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
a1f0: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71   pBt->pNext = sq
a200: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a210: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
a220: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a230: 73 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  st = pBt;.      
a240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a250: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
a260: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a270: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
a280: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a290: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
a2a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a2b0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
a2c0: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
a2d0: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
a2e0: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
a2f0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
a300: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
a310: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
a320: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
a330: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
a340: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
a350: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
a360: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
a370: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
a380: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
a390: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
a3a0: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
a3b0: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
a3c0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
a3d0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
a3e0: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
a3f0: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
a400: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
a410: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
a420: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
a430: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
a440: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
a450: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
a460: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
a470: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
a480: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
a490: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
a4a0: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
a4b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a4c0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
a4d0: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
a4e0: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
a4f0: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
a500: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
a510: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
a520: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a530: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
a540: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
a550: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
a560: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
a570: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
a580: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
a590: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
a5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a5b0: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
a5c0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
a5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a5e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a5f0: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
a600: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
a610: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
a620: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a630: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
a640: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
a650: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
a660: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
a670: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a680: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
a690: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a6a0: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
a6b0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
a6c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a6d0: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
a6e0: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
a6f0: 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
a700: 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
a710: 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
a720: 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
a730: 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
a740: 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
a750: 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
a760: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
a770: 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
a780: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
a790: 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
a7a0: 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
a7b0: 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
a7c0: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
a7d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
a7e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a7f0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a800: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a810: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53   *pMaster;.  BtS
a820: 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
a830: 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
a840: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
a850: 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
a860: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
a870: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  .  pMaster = sql
a880: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
a890: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
a8a0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
a8b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a8c0: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
a8d0: 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
a8e0: 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
a8f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
a900: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a910: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
a920: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a930: 68 65 4c 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e  heList = pBt->pN
a940: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
a950: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
a960: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a970: 4c 69 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c  List;.      whil
a980: 65 28 20 70 4c 69 73 74 20 26 26 20 70 4c 69 73  e( pList && pLis
a990: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
a9a0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
a9b0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
a9c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a9d0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
a9e0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
a9f0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
aa00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
aa10: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
aa20: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
aa30: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
aa40: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
aa50: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
aa60: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
aa70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
aa80: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
aa90: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
aaa0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
aab0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
aac0: 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73   an open databas
aad0: 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65  e and invalidate
aae0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f   all cursors..*/
aaf0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
ab00: 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29  eClose(Btree *p)
ab10: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
ab20: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
ab30: 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20  Cursor *pCur;.. 
ab40: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75   /* Close all cu
ab50: 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61  rsors opened via
ab60: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a   this handle.  *
ab70: 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
ab80: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ab90: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
aba0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
abb0: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
abc0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75  b = p->db;.  pCu
abd0: 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
abe0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
abf0: 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
ac00: 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
ac10: 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
ac20: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
ac30: 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
ac40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
ac50: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
ac60: 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
ac70: 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
ac80: 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
ac90: 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
aca0: 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
acb0: 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
acc0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
acd0: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
ace0: 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
acf0: 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
ad00: 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
ad10: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
ad20: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73  Rollback(p);.  s
ad30: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
ad40: 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
ad50: 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
ad60: 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
ad70: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
ad80: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
ad90: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
ada0: 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
adb0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
adc0: 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
add0: 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
ade0: 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
adf0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
ae00: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
ae10: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
ae20: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
ae30: 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
ae40: 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
ae50: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
ae60: 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
ae70: 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
ae80: 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
ae90: 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
aea0: 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
aeb0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
aec0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
aed0: 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
aee0: 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
aef0: 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
af00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
af10: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
af20: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
af30: 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
af40: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
af50: 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
af60: 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
af70: 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
af80: 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
af90: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
afa0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e  lite3_free(pBt->
afb0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
afc0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e  lite3_free(pBt->
afd0: 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
afe0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
aff0: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
b000: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
b010: 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
b020: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
b030: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b040: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
b050: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
b060: 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
b070: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
b080: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
b090: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b0a0: 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
b0b0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
b0c0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
b0d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b0e0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
b0f0: 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
b100: 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
b110: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
b120: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
b130: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
b140: 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
b150: 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
b160: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
b170: 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
b180: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
b190: 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
b1a0: 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
b1b0: 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
b1c0: 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
b1d0: 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
b1e0: 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
b1f0: 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
b200: 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
b210: 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
b220: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
b230: 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
b240: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
b250: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
b260: 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
b270: 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
b280: 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
b290: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
b2a0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
b2b0: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
b2c0: 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
b2d0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
b2e0: 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
b2f0: 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
b300: 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
b310: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
b320: 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
b330: 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
b340: 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
b350: 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
b360: 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
b370: 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
b380: 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
b390: 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
b3a0: 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
b3b0: 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
b3c0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
b3d0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
b3e0: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
b3f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b400: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b410: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b420: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
b430: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
b440: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
b450: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
b460: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
b470: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
b480: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b490: 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
b4a0: 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
b4b0: 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
b4c0: 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
b4d0: 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
b4e0: 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
b4f0: 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
b500: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
b510: 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
b520: 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
b530: 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
b540: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
b550: 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
b560: 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
b570: 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
b580: 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
b590: 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
b5a0: 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
b5b0: 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
b5c0: 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
b5d0: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b5e0: 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
b5f0: 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
b600: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
b610: 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
b620: 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
b630: 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
b640: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
b650: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
b660: 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
b670: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
b680: 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
b690: 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
b6a0: 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
b6b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
b6c0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
b6d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b6e0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
b6f0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
b700: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
b710: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
b720: 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
b730: 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
b740: 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69  ullSync);.  sqli
b750: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
b760: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
b770: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
b780: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
b790: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
b7a0: 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
b7b0: 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
b7c0: 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
b7d0: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
b7e0: 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
b7f0: 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
b800: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
b810: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
b820: 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
b830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
b850: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
b860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b870: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
b880: 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74  );  .  sqlite3Bt
b890: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
b8a0: 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
b8b0: 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
b8c0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
b8d0: 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
b8e0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
b8f0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
b900: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
b910: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b920: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
b930: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
b940: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
b950: 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
b960: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
b970: 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
b980: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
b990: 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
b9a0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
b9b0: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
b9c0: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
b9d0: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
b9e0: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
b9f0: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
ba00: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
ba10: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
ba20: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
ba30: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
ba40: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
ba50: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
ba60: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
ba70: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
ba80: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
ba90: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
baa0: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
bab0: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
bac0: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
bad0: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
bae0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
baf0: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
bb00: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
bb10: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
bb20: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
bb30: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
bb40: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
bb50: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
bb60: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
bb70: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
bb80: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
bb90: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
bba0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
bbb0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
bbc0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
bbd0: 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
bbe0: 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
bbf0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bc00: 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
bc10: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
bc20: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
bc30: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
bc40: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
bc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
bc60: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
bc70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
bc80: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
bc90: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
bca0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
bcb0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
bcc0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
bcd0: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
bce0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
bcf0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
bd00: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
bd10: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
bd20: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
bd30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
bd40: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
bd50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
bd60: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
bd70: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
bd80: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
bd90: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
bda0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
bdb0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
bdc0: 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
bdd0: 63 65 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ce = 0;.    rc =
bde0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
bdf0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
be00: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
be10: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74  Size);.  }.  pBt
be20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
be30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
be40: 52 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69 74  Reserve;.  sqlit
be50: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
be60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
be70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
be80: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
be90: 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
bea0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
beb0: 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
bec0: 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
bed0: 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
bee0: 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  e;.}.int sqlite3
bef0: 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
bf00: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
bf10: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
bf20: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
bf30: 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
bf40: 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
bf50: 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
bf60: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
bf70: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
bf80: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
bf90: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
bfa0: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
bfb0: 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
bfc0: 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
bfd0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
bfe0: 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
bff0: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
c000: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
c010: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
c020: 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
c030: 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
c040: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c050: 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
c060: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
c070: 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
c080: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c090: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
c0a0: 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
c0b0: 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
c0c0: 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
c0d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c0e0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c0f0: 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
c100: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c110: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
c120: 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
c130: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
c140: 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
c150: 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
c160: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
c170: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
c180: 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
c190: 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
c1a0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
c1b0: 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
c1c0: 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
c1d0: 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
c1e0: 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
c1f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
c200: 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
c210: 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
c220: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
c230: 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
c240: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
c250: 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
c260: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
c270: 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
c280: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
c290: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
c2a0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
c2b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
c2c0: 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
c2d0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
c2e0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
c2f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c300: 20 69 6e 74 20 61 76 20 3d 20 28 61 75 74 6f 56   int av = (autoV
c310: 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20 73  acuum?1:0);..  s
c320: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c330: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
c340: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26  pageSizeFixed &&
c350: 20 61 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61   av!=pBt->autoVa
c360: 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
c370: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
c380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c390: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
c3a0: 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   av;.  }.  sqlit
c3b0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c3c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
c3d0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
c3e0: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
c3f0: 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
c400: 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
c410: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
c420: 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
c430: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
c440: 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
c450: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
c460: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
c470: 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
c480: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
c490: 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
c4a0: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
c4b0: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
c4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c4d0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
c4e0: 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
c4f0: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
c500: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
c510: 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
c520: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
c530: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
c540: 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
c550: 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
c560: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
c570: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c580: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
c590: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
c5a0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
c5b0: 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
c5c0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
c5d0: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
c5e0: 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
c5f0: 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
c600: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
c610: 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
c620: 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
c630: 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
c640: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
c650: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
c660: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
c670: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
c680: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
c690: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
c6a0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
c6b0: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
c6c0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
c6d0: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
c6e0: 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
c6f0: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
c700: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
c710: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
c720: 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
c730: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c740: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c750: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
c760: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
c770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c790: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
c7a0: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
c7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c7c0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c7d0: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
c7e0: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
c7f0: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
c800: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
c810: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
c820: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
c830: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51 4c  .  */.  rc = SQL
c840: 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69 66  ITE_NOTADB;.  if
c850: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
c860: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
c870: 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  ger)>0 ){.    in
c880: 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
c890: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
c8a0: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
c8b0: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
c8c0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
c8d0: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
c8e0: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
c8f0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
c900: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
c910: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
c920: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
c930: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
c940: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c950: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
c960: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
c970: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
c980: 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
c990: 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
c9a0: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
c9b0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
c9c0: 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67  eSize)!=0 || pag
c9d0: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20  eSize<512 ||.   
c9e0: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58       (SQLITE_MAX
c9f0: 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38  _PAGE_SIZE<32768
ca00: 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   && pageSize>SQL
ca10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ca20: 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  E).    ){.      
ca30: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
ca40: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
ca50: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
ca60: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
ca70: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
ca80: 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
ca90: 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61  [20];.    if( pa
caa0: 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
cab0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
cac0: 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
cad0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
cae0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
caf0: 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
cb00: 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
cb10: 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
cb20: 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
cb30: 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
cb40: 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
cb50: 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
cb60: 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
cb70: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
cb80: 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
cb90: 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
cba0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
cbb0: 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
cbc0: 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
cbd0: 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
cbe0: 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
cbf0: 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
cc00: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
cc10: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
cc20: 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
cc30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
cc40: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
cc50: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
cc60: 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
cc70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cc80: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
cc90: 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
cca0: 70 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  pace = 0;.      
ccb0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
ccc0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
ccd0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
cce0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
ccf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cd00: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
cd10: 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
cd20: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
cd30: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
cd40: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
cd50: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
cd60: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
cd70: 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
cd80: 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d  ;.    pBt->maxEm
cd90: 62 65 64 46 72 61 63 20 3d 20 70 61 67 65 31 5b  bedFrac = page1[
cda0: 32 31 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69  21];.    pBt->mi
cdb0: 6e 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61 67  nEmbedFrac = pag
cdc0: 65 31 5b 32 32 5d 3b 0a 20 20 20 20 70 42 74 2d  e1[22];.    pBt-
cdd0: 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20 70  >minLeafFrac = p
cde0: 61 67 65 31 5b 32 33 5d 3b 0a 23 69 66 6e 64 65  age1[23];.#ifnde
cdf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ce00: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
ce10: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
ce20: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
ce30: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
ce40: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
ce50: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ce60: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
ce70: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
ce80: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
ce90: 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
cea0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
ceb0: 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
cec0: 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
ced0: 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
cee0: 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
cef0: 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
cf00: 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
cf10: 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
cf20: 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
cf30: 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
cf40: 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
cf50: 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
cf60: 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
cf70: 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
cf80: 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
cf90: 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
cfa0: 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
cfb0: 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
cfc0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
cfd0: 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
cfe0: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
cff0: 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
d000: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
d010: 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
d020: 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
d030: 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
d040: 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
d050: 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
d060: 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
d070: 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
d080: 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
d090: 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
d0a0: 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
d0b0: 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
d0c0: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
d0d0: 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
d0e0: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
d0f0: 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 61  Size-12)*pBt->ma
d100: 78 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d  xEmbedFrac/255 -
d110: 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
d120: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
d130: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
d140: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 2f 32 35  >minEmbedFrac/25
d150: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
d160: 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
d170: 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
d180: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
d190: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
d1a0: 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61  -12)*pBt->minLea
d1b0: 66 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  fFrac/255 - 23;.
d1c0: 20 20 69 66 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f    if( pBt->minLo
d1d0: 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  cal>pBt->maxLoca
d1e0: 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  l || pBt->maxLoc
d1f0: 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  al<0 ){.    goto
d200: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
d210: 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ed;.  }.  assert
d220: 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
d230: 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
d240: 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
d250: 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
d260: 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
d270: 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
d280: 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
d290: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
d2a0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
d2b0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
d2c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
d2d0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
d2e0: 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ike lockBtree() 
d2f0: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61  except that it a
d300: 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  lso invokes the.
d310: 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ** busy callback
d320: 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63   if there is loc
d330: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f  k contention..*/
d340: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
d350: 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42  BtreeWithRetry(B
d360: 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69  tree *pRef){.  i
d370: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d380: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
d390: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
d3a0: 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a 20 20  utex(pRef) );.  
d3b0: 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e  if( pRef->inTran
d3c0: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
d3d0: 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e 73 61  .    u8 inTransa
d3e0: 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42  ction = pRef->pB
d3f0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
d400: 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67  ;.    btreeInteg
d410: 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20 20 20  rity(pRef);.    
d420: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d430: 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52 65 66  eBeginTrans(pRef
d440: 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e  , 0);.    pRef->
d450: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
d460: 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63 74 69  on = inTransacti
d470: 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e  on;.    pRef->in
d480: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
d490: 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  NE;.    if( rc==
d4a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4b0: 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54     pRef->pBt->nT
d4c0: 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
d4d0: 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49 6e 74    }.    btreeInt
d4e0: 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
d4f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
d500: 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  .       ../*.** 
d510: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
d520: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
d530: 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
d540: 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
d550: 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
d560: 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
d570: 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
d580: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
d590: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
d5a0: 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
d5b0: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
d5c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
d5d0: 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
d5e0: 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
d5f0: 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
d600: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
d610: 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74  re are any outst
d620: 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 2c 20  anding cursors, 
d630: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d640: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
d650: 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
d660: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
d670: 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
d680: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
d690: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
d6a0: 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
d6b0: 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
d6c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
d6d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d6e0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d6f0: 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
d700: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
d710: 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75 72 73  NE && pBt->pCurs
d720: 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e 70 50  or==0 && pBt->pP
d730: 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 69  age1!=0 ){.    i
d740: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f( sqlite3PagerR
d750: 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
d760: 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20  ger)>=1 ){.     
d770: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
d780: 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23  age1->aData );.#
d790: 69 66 20 30 0a 20 20 20 20 20 20 69 66 28 20 70  if 0.      if( p
d7a0: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
d7b0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
d7c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
d7d0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
d7e0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61        pPage->aDa
d7f0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
d800: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
d810: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
d820: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
d830: 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  Bt;.        pPag
d840: 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  e->pgno = 1;.   
d850: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d860: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
d870: 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
d880: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  }.    pBt->pPage
d890: 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  1 = 0;.    pBt->
d8a0: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
d8b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d8c0: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62  a new database b
d8d0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
d8e0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
d8f0: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f   the.** file..*/
d900: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
d910: 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
d920: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
d930: 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
d940: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
d950: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
d960: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d970: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
d980: 78 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  x) );.  if( sqli
d990: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
d9a0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 30  t(pBt->pPager)>0
d9b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d9c0: 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d 20 70 42 74  _OK;.  pP1 = pBt
d9d0: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
d9e0: 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
d9f0: 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
da00: 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
da10: 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
da20: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
da30: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
da40: 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
da50: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
da60: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
da70: 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
da80: 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
da90: 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
daa0: 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
dab0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
dac0: 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
dad0: 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
dae0: 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42  .  data[20] = pB
daf0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
db00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
db10: 20 64 61 74 61 5b 32 31 5d 20 3d 20 70 42 74 2d   data[21] = pBt-
db20: 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 3b 0a 20  >maxEmbedFrac;. 
db30: 20 64 61 74 61 5b 32 32 5d 20 3d 20 70 42 74 2d   data[22] = pBt-
db40: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 3b 0a 20  >minEmbedFrac;. 
db50: 20 64 61 74 61 5b 32 33 5d 20 3d 20 70 42 74 2d   data[23] = pBt-
db60: 3e 6d 69 6e 4c 65 61 66 46 72 61 63 3b 0a 20 20  >minLeafFrac;.  
db70: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
db80: 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
db90: 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
dba0: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
dbb0: 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
dbc0: 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
dbd0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
dbe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dbf0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
dc00: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
dc10: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
dc20: 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
dc30: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
dc40: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
dc50: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
dc60: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
dc70: 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
dc80: 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
dc90: 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
dca0: 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
dcb0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
dcc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
dcd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dce0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
dcf0: 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
dd00: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
dd10: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
dd20: 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
dd30: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
dd40: 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
dd50: 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
dd60: 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
dd70: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
dd80: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
dd90: 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
dda0: 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
ddb0: 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
ddc0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
ddd0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
dde0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
ddf0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
de00: 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
de10: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
de20: 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
de30: 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
de40: 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
de50: 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
de60: 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
de70: 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
de80: 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
de90: 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
dea0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
deb0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
dec0: 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
ded0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
dee0: 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
def0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
df00: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
df10: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
df20: 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
df30: 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
df40: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
df50: 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
df60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
df70: 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
df80: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
df90: 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
dfa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
dfb0: 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
dfc0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
dfd0: 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
dfe0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
dff0: 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
e000: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e010: 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
e020: 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
e030: 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
e040: 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
e050: 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
e060: 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
e070: 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
e080: 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
e090: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
e0a0: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
e0b0: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
e0c0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e0d0: 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
e0e0: 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
e0f0: 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
e100: 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
e110: 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
e120: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e130: 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
e140: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
e150: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
e160: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
e170: 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
e180: 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
e190: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
e1a0: 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
e1b0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
e1c0: 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
e1d0: 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
e1e0: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
e1f0: 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
e200: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
e210: 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
e220: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
e230: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
e240: 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
e250: 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
e260: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
e270: 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
e280: 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
e290: 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
e2a0: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
e2b0: 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
e2c0: 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
e2d0: 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
e2e0: 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
e2f0: 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
e300: 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
e310: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
e320: 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
e330: 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
e340: 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
e350: 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
e360: 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
e370: 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
e380: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
e390: 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
e3a0: 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
e3b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
e3c0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
e3d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
e3e0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
e3f0: 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
e400: 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e  p->db;.  btreeIn
e410: 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
e420: 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
e430: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
e440: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
e450: 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
e460: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
e470: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
e480: 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
e490: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
e4a0: 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
e4b0: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
e4c0: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
e4d0: 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
e4e0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
e4f0: 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
e500: 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
e510: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
e520: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
e530: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
e540: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
e550: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
e560: 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
e570: 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
e580: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
e590: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
e5a0: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
e5b0: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  egun;.  }..  /* 
e5c0: 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
e5d0: 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
e5e0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
e5f0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e600: 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
e610: 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
e620: 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
e630: 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
e640: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
e650: 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
e660: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
e670: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  /.  if( pBt->inT
e680: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
e690: 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61  S_WRITE && wrfla
e6a0: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
e6b0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
e6c0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
e6d0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
e6e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
e6f0: 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72 66  _CACHE.  if( wrf
e700: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
e710: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
e720: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
e730: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
e740: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
e750: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
e760: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
e770: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e780: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
e790: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
e7a0: 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  un;.      }.    
e7b0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
e7c0: 64 6f 20 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  do {.    while( 
e7d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e7e0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
e7f0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f  ){.      rc = lo
e800: 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20  ckBtree(pBt);.  
e810: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
e820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
e830: 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
e840: 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
e850: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e860: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e870: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e880: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e890: 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
e8a0: 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
e8b0: 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20  e, wrflag>1);.  
e8c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e8d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e8e0: 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
e8f0: 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
e900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e910: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
e920: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e930: 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
e940: 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d   ) pBt->inStmt =
e950: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e960: 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
e970: 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
e980: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
e990: 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
e9a0: 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
e9b0: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
e9c0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 73 71   &&.          sq
e9d0: 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65  lite3BtreeInvoke
e9e0: 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2c  BusyHandler(pBt,
e9f0: 20 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63   0) );..  if( rc
ea00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ea10: 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
ea20: 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
ea30: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
ea40: 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
ea50: 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
ea60: 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
ea70: 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
ea80: 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
ea90: 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
eaa0: 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
eab0: 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
eac0: 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
ead0: 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
eae0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
eaf0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
eb00: 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
eb10: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
eb20: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 29 3b  t->pExclusive );
eb30: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 45 78 63  .      pBt->pExc
eb40: 6c 75 73 69 76 65 20 3d 20 70 3b 0a 20 20 20 20  lusive = p;.    
eb50: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
eb60: 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74  rans_begun:.  bt
eb70: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
eb80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
eb90: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
eba0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
ebb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ebc0: 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
ebd0: 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
ebe0: 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
ebf0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
ec00: 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
ec10: 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
ec20: 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
ec30: 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
ec40: 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
ec50: 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
ec60: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
ec70: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
ec80: 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
ec90: 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
eca0: 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
ecb0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ece0: 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
ecf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ed20: 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
ed30: 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
ed40: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ed70: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
ed80: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ed90: 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72  ;.  int isInitOr
eda0: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
edb0: 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
edc0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
edd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ede0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
edf0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ee00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ee10: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
ee20: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
ee30: 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
ee40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ee50: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
ee60: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
ee70: 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
ee80: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
ee90: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
eea0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
eeb0: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
eec0: 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
eed0: 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
eee0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
eef0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
ef00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ef10: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
ef20: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
ef30: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
ef40: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
ef50: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
ef60: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
ef70: 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
ef80: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
ef90: 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
efa0: 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
efb0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
efc0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
efd0: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
efe0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
eff0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
f000: 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
f010: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
f020: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
f030: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
f040: 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
f050: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
f060: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
f070: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
f080: 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
f090: 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
f0a0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
f0b0: 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
f0c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f0d0: 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
f0e0: 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
f0f0: 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  renteed to be a 
f100: 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
f110: 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
f120: 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
f130: 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
f140: 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
f150: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
f160: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
f170: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
f180: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
f190: 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
f1a0: 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
f1b0: 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
f1c0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
f1d0: 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
f1e0: 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
f1f0: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
f200: 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
f230: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
f240: 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
f250: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
f260: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
f270: 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
f280: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
f290: 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
f2a0: 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
f2b0: 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
f2c0: 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
f2d0: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
f2e0: 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
f2f0: 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
f300: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
f310: 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
f330: 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
f340: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
f350: 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
f360: 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
f370: 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
f380: 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
f390: 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
f3a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f3b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
f3c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
f3d0: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
f3e0: 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
f3f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
f400: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
f410: 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
f420: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
f430: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
f440: 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
f450: 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
f460: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f470: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f480: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
f490: 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
f4a0: 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
f4b0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 73 49  lse{.    int isI
f4c0: 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
f4d0: 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
f4e0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
f4f0: 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  l;..    sqlite3B
f500: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
f510: 67 65 2c 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c  ge, 0);.    nCel
f520: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
f530: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
f540: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
f550: 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
f560: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
f570: 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
f580: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
f590: 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
f5a0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
f5b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f5c0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
f5d0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
f5e0: 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
f5f0: 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
f600: 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
f610: 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
f620: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
f630: 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
f640: 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
f650: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
f660: 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
f670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
f680: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
f690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f6b0: 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
f6c0: 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
f6d0: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
f6e0: 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
f6f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f710: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
f720: 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
f730: 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
f740: 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
f750: 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
f760: 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
f770: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
f780: 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
f790: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f7a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f7b0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
f7c0: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
f7d0: 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
f7e0: 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
f7f0: 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
f800: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
f810: 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
f820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f830: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
f840: 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
f850: 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
f860: 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
f870: 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
f880: 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
f890: 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
f8a0: 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
f8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f8c0: 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
f8d0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
f8e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
f8f0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
f900: 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
f910: 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
f920: 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
f930: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f940: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
f950: 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
f960: 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
f970: 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
f980: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f990: 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
f9a0: 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
f9b0: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
f9c0: 65 65 50 61 67 65 20 20 20 20 20 20 20 20 20 20  eePage          
f9d0: 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
f9e0: 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
f9f0: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50   to */.){.  MemP
fa00: 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
fa10: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
fa20: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
fa30: 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
fa40: 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
fa50: 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
fa60: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
fa70: 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
fa80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
fa90: 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
faa0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
fab0: 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
fac0: 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
fad0: 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
fae0: 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
faf0: 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
fb00: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
fb10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
fb20: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
fb30: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
fb40: 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
fb50: 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
fb60: 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
fb70: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
fb80: 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
fb90: 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
fba0: 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
fbb0: 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
fbc0: 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
fbd0: 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
fbe0: 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
fbf0: 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
fc00: 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
fc10: 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
fc20: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
fc30: 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
fc40: 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
fc50: 65 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  ePage);.  if( rc
fc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fc70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fc80: 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
fc90: 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
fca0: 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
fcb0: 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
fcc0: 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
fcd0: 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
fce0: 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
fcf0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
fd00: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
fd10: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
fd20: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
fd30: 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
fd40: 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
fd50: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
fd60: 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
fd70: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
fd80: 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
fd90: 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
fda0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
fdb0: 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
fdc0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
fdd0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
fde0: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
fdf0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
fe00: 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
fe10: 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
fe20: 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
fe30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
fe40: 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
fe50: 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
fe60: 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
fe70: 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
fe80: 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
fe90: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fea0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
feb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
fec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
fed0: 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
fee0: 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
fef0: 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
ff00: 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
ff10: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
ff20: 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
ff30: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
ff40: 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b  OW2, iFreePage);
ff50: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
ff60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ff70: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ff90: 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
ffa0: 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
ffb0: 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
ffc0: 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
ffd0: 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
ffe0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
fff0: 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
10000 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
10010 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
10020 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
10030 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
10040 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
10050 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
10060 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
10070 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
10080 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
10090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
100a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
100b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
100c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
100d0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
100e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
100f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
10110 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
10120 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
10130 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10140 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
10150 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
10160 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
10170 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
10180 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
10190 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
101a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
101b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
101c0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
101d0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
101e0 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
101f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10200 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
10210 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
10220 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
10230 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
10240 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
10250 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
10260 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
10270 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
10280 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
10290 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
102a0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
102b0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
102c0 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
102d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
102e0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
102f0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
10300 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
10310 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
10320 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
10330 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
10340 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
10350 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
10360 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
10370 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
10380 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
10390 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
103a0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
103b0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
103c0 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
103d0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
103e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
103f0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
10400 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
10410 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
10420 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
10430 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
10440 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
10450 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
10460 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
10470 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
10480 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
10490 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
104a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
104b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
104c0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
104d0 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
104e0 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
104f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10500 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
10510 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
10520 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f  no nFin){.  Pgno
10530 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20   iLastPg;       
10540 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
10550 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
10560 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72  se */.  Pgno nFr
10570 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
10580 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
10590 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
105a0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
105b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
105d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c  ->mutex) );.  iL
105e0 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72  astPg = pBt->nTr
105f0 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74  unc;.  if( iLast
10600 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  Pg==0 ){.    iLa
10610 73 74 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61  stPg = sqlite3Pa
10620 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
10630 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  ->pPager);.  }..
10640 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
10650 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
10660 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
10670 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
10680 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  (pBt) ){.    int
10690 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70   rc;.    u8 eTyp
106a0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
106b0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
106c0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
106d0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
106e0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
106f0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c  ( nFreeList==0 |
10700 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20  | nFin==iLastPg 
10710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10720 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10730 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
10740 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
10750 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
10760 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
10770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10780 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10790 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
107a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
107b0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
107c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
107d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
107e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
107f0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
10800 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
10810 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
10820 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
10830 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
10840 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
10850 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
10860 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
10870 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
10880 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
10890 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
108a0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
108b0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
108c0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
108d0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
108e0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
108f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
10900 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
10910 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
10920 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
10930 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10940 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
10950 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
10960 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
10970 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
10980 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
10990 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
109a0 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
109b0 20 20 20 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 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
109e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
109f0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
10a00 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
10a10 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
10a20 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
10a30 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
10a40 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
10a50 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
10a60 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
10a70 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
10a80 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
10a90 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
10aa0 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
10ab0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
10ac0 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
10ad0 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
10ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10af0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10b00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10b10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10b20 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72  * If nFin is zer
10b30 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
10b40 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
10b50 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
10b60 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
10b70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
10b80 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
10b90 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
10ba0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
10bb0 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
10bc0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e  other hand, if n
10bd0 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74  Fin is greater t
10be0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
10bf0 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
10c00 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
10c10 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
10c20 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
10c30 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
10c40 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
10c50 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
10c60 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  */.      do {.  
10c70 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
10c80 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
10c90 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
10ca0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
10cb0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
10cc0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
10cd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
10cf0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
10d00 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
10d10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10d20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
10d30 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
10d40 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e  .      }while( n
10d50 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50  Fin!=0 && iFreeP
10d60 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
10d70 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
10d80 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
10d90 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c   .      rc = sql
10da0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
10db0 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29  LastPg->pDbPage)
10dc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
10dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10de0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
10df0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
10e00 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
10e10 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b 0a  Page, iFreePg);.
10e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
10e30 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
10e40 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
10e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10e60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
10e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10e80 20 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75    }..  pBt->nTru
10e90 6e 63 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31  nc = iLastPg - 1
10ea0 3b 0a 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e  ;.  while( pBt->
10eb0 6e 54 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f  nTrunc==PENDING_
10ec0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c  BYTE_PAGE(pBt)||
10ed0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
10ee0 74 2c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20  t, pBt->nTrunc) 
10ef0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  ){.    pBt->nTru
10f00 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nc--;.  }.  retu
10f10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10f20 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
10f30 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
10f40 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
10f50 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
10f60 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
10f70 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
10f80 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
10f90 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
10fa0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
10fb0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
10fc0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
10fd0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
10fe0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
10ff0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
11000 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
11010 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
11020 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
11030 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a  rror occured,.**
11040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11050 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11060 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
11070 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
11080 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
11090 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
110a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
110b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
110c0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
110d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
110e0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
110f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11100 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11110 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
11120 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
11130 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
11140 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
11150 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11160 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
11170 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
11180 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
11190 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
111a0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
111b0 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  pBt, 0);.  }.  s
111c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
111d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
111e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
111f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11200 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
11210 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
11220 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
11230 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
11240 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
11250 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
11260 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
11270 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
11280 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
11290 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
112a0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
112b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
112c0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
112d0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
112e0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
112f0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
11300 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
11310 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
11320 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
11330 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
11340 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
11350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
11360 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
11370 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
11380 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20  no *pnTrunc){.  
11390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
113a0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
113b0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
113c0 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  r;.#ifndef NDEBU
113d0 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  G.  int nRef = s
113e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
113f0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e  unt(pPager);.#en
11400 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73  dif..  assert( s
11410 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11420 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11430 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
11440 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
11450 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
11460 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
11470 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
11480 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
11490 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20  o nFin = 0;..   
114a0 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
114b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ==0 ){.      Pgn
114c0 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 50  o nFree;.      P
114d0 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  gno nPtrmap;.   
114e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
114f0 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  z = pBt->pageSiz
11500 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4f  e;.      Pgno nO
11510 72 69 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rig = sqlite3Pag
11520 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
11530 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  >pPager);..     
11540 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
11550 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29  GE(pBt, nOrig) )
11560 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11570 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11580 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
11590 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50      if( nOrig==P
115a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
115b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
115c0 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20   nOrig--;.      
115d0 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
115e0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
115f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
11600 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70  );.      nPtrmap
11610 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
11620 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
11630 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35  t, nOrig)+pgsz/5
11640 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20  )/(pgsz/5);.    
11650 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
11660 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
11670 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69  ;.      if( nOri
11680 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
11690 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
116a0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  <=PENDING_BYTE_P
116b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
116c0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
116d0 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
116e0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
116f0 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
11700 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
11710 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11720 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
11730 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11740 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
11750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
11760 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
11770 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20  p(pBt, nFin);.  
11780 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
11790 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
117a0 20 20 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e       assert(nFin
117b0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75  ==0 || pBt->nTru
117c0 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70  nc==0 || nFin<=p
117d0 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20  Bt->nTrunc);.   
117e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
117f0 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  K;.      if( pBt
11800 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
11810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11820 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
11830 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
11840 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
11850 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11860 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
11870 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
11880 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
11890 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
118a0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e        pBt->nTrun
118b0 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  c = nFin;.      
118c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
118d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
118e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
118f0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
11900 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
11910 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11920 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72  _OK ){.    *pnTr
11930 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  unc = pBt->nTrun
11940 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  c;.    pBt->nTru
11950 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  nc = 0;.  }.  as
11960 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
11970 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
11980 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
11990 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
119a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
119b0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
119c0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
119d0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
119e0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
119f0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
11a00 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
11a10 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
11a20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
11a30 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
11a40 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
11a50 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
11a60 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
11a70 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
11a80 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
11a90 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
11aa0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
11ab0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
11ac0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
11ad0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
11ae0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11af0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
11b00 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
11b10 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
11b20 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
11b30 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
11b40 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
11b50 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11b60 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
11b70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11b80 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
11b90 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
11ba0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
11bb0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
11bc0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
11bd0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
11be0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
11bf0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
11c00 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
11c10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
11c20 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
11c30 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
11c40 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f  BtreeCommit() fo
11c50 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
11c60 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
11c70 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
11c80 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
11c90 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
11ca0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
11cb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
11cc0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
11cd0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
11ce0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
11cf0 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
11d00 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
11d10 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
11d20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
11d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
11d40 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
11d50 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
11d60 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
11d70 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
11d80 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
11d90 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
11da0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
11db0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
11dc0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
11dd0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
11de0 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
11df0 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
11e00 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
11e10 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
11e20 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
11e30 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
11e40 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
11e50 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
11e60 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
11e70 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
11e80 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
11e90 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
11ea0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
11eb0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
11ec0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
11ed0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
11ee0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
11ef0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
11f00 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
11f10 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
11f20 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
11f30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11f40 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
11f50 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
11f60 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
11f70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11f80 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20      Pgno nTrunc 
11f90 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
11fa0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11fb0 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e     pBt->db = p->
11fc0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
11fd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11fe0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
11ff0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12000 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
12010 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26  uumCommit(pBt, &
12020 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20  nTrunc); .      
12030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
12050 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12060 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12070 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
12080 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
12090 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
120a0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
120b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
120c0 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b  ter, nTrunc, 0);
120d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
120e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
120f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12100 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
12110 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
12120 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
12130 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12140 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
12150 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
12160 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
12170 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
12180 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
12190 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
121a0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
121b0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
121c0 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
121d0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
121e0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
121f0 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
12200 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
12210 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
12220 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
12230 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
12240 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
12250 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
12260 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
12270 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
12280 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
12290 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
122a0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
122b0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
122c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
122d0 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
122e0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
122f0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
12300 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
12310 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
12320 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
12330 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
12340 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
12350 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
12360 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
12370 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
12380 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
12390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
123a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
123b0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
123c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
123d0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
123e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
123f0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
12400 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  >db;.  btreeInte
12410 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
12420 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
12430 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
12440 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
12450 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
12460 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
12470 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
12480 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
12490 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
124a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
124b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
124c0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
124d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
124e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
124f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
12500 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12510 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
12520 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12530 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
12540 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
12550 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
12560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12570 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12580 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12590 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
125a0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
125b0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
125c0 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69  READ;.    pBt->i
125d0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
125e0 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
125f0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
12600 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79  e handle has any
12610 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
12620 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
12630 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  ment the transac
12640 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20  tion.  ** count 
12650 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
12660 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
12670 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65  saction count re
12680 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a  aches 0, set.  *
12690 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  * the shared sta
126a0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
126b0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
126c0 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c  eIfUnused() call
126d0 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c   below.  ** will
126e0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
126f0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  r..  */.  if( p-
12700 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
12710 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d  NONE ){.    pBt-
12720 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
12730 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
12740 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
12750 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
12760 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
12770 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
12780 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
12790 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20  handles current 
127a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
127b0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
127c0 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20  and unlock.  ** 
127d0 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69  the pager if thi
127e0 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
127f0 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
12800 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12810 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72  ..  */.  p->inTr
12820 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12830 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
12840 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
12850 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12860 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
12870 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12890 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
128a0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
128b0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
128c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
128d0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
128e0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
128f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
12900 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12910 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
12920 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
12930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12940 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
12950 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
12960 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
12970 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12990 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
129a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
129b0 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
129c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
129d0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
129e0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
129f0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
12a00 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
12a10 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
12a20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
12a30 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
12a40 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
12a50 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
12a60 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
12a70 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
12a80 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
12a90 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
12aa0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
12ab0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
12ac0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
12ad0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
12ae0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
12af0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
12b00 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
12b10 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
12b20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
12b30 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
12b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
12b50 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
12b60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
12b70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
12b80 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
12b90 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
12ba0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
12bb0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
12bc0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
12bd0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
12be0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
12bf0 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
12c00 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
12c10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
12c20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
12c30 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
12c40 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
12c50 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
12c60 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
12c70 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
12c80 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
12c90 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
12ca0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
12cb0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
12cc0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
12cd0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
12ce0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
12cf0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
12d00 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
12d10 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
12d20 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
12d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12d40 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
12d50 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
12d60 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
12d70 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
12d80 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
12d90 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
12da0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
12db0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
12dc0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
12dd0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
12de0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
12df0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
12e00 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
12e10 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
12e20 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
12e30 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
12e40 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
12e50 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
12e60 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
12e70 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
12e80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12e90 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
12ea0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
12eb0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
12ec0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
12ed0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12ee0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
12ef0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
12f00 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
12f10 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
12f20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
12f30 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  ion(p);.    p->e
12f40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
12f50 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
12f60 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d  p = errCode;.  }
12f70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12f80 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
12f90 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
12fa0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12fb0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
12fc0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
12fd0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
12fe0 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
12ff0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
13000 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
13010 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
13020 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
13030 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
13040 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
13050 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
13060 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
13070 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
13080 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13090 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
130a0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
130b0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
130c0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
130d0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
130e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
130f0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
13100 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13110 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13120 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
13130 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
13140 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13150 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
13160 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
13170 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
13180 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
13190 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
131a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
131b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
131c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
131d0 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
131e0 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
131f0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
13200 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a   occured whilst.
13210 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
13220 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
13230 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
13240 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
13250 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
13260 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
13270 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
13280 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
13290 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
132a0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
132b0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
132c0 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
132d0 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
132e0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
132f0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
13300 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
13310 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
13320 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
13330 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
13340 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
13350 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
13360 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
13370 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
13380 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
13390 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
133a0 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
133b0 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
133c0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
133d0 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54  p);.  unlockAllT
133e0 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28  ables(p);..  if(
133f0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
13400 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
13410 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65  int rc2;..#ifnde
13420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13430 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
13440 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65  ->nTrunc = 0;.#e
13450 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
13460 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
13470 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13480 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
13490 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
134a0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
134b0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
134c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
134d0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
134e0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
134f0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
13500 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
13510 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
13520 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
13530 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
13540 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
13550 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
13560 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
13570 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
13580 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
13590 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
135a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
135b0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
135c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
135d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
135e0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
135f0 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
13600 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
13610 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
13620 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
13630 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
13640 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
13650 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
13660 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
13670 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
13680 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
13690 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
136a0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
136b0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
136c0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
136d0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
136e0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
136f0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
13700 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74  RANS_NONE;.  pBt
13710 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
13720 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
13730 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
13740 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13750 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13760 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13770 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
13780 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
13790 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
137a0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
137b0 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62  ion can.** can b
137c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  e rolled back in
137d0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
137e0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
137f0 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74  ion..** You must
13800 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
13810 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72  tion before star
13820 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
13830 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75  ction..** The su
13840 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
13850 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
13860 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20  lly if the main 
13870 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63  transaction.** c
13880 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
13890 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  back..**.** Only
138a0 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74   one subtransact
138b0 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76  ion may be activ
138c0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74  e at a time.  It
138d0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
138e0 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20  try.** to start 
138f0 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63  a new subtransac
13900 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20  tion if another 
13910 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
13920 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
13930 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
13940 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
13950 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
13960 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
13970 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
13980 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
13990 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
139a0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
139b0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
139c0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
139d0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
139e0 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
139f0 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
13a00 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
13a10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
13a20 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
13a30 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
13a40 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
13a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13a60 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
13a70 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13a80 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13a90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13aa0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13ab0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
13ac0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
13ad0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
13ae0 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
13af0 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72  >inStmt ){.    r
13b00 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
13b10 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
13b20 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
13b30 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
13b40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
13b50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13b60 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
13b70 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
13b80 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ly ? SQLITE_OK :
13b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13ba0 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  tBegin(pBt->pPag
13bb0 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
13bc0 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Stmt = 1;.  }.  
13bd0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13be0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13bf0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
13c00 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74  mit the statment
13c10 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
13c20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
13c30 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a  gress.  If no.**
13c40 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
13c50 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20  is active, this 
13c60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
13c70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
13c80 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20  ommitStmt(Btree 
13c90 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
13ca0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13cb0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
13cc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13cd0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
13ce0 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
13cf0 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
13d00 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
13d10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13d20 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  StmtCommit(pBt->
13d30 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
13d40 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13d50 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
13d60 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73  >inStmt = 0;.  s
13d70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13d80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
13da0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73  ack the active s
13db0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
13dc0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20  saction.  If no 
13dd0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  subtransaction.*
13de0 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73  * is active this
13df0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13e00 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  -op..**.** All c
13e10 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
13e20 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
13e30 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
13e40 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  ny attempt.** to
13e50 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68   use a cursor th
13e60 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
13e70 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
13e80 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  this operation.*
13e90 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  * will result in
13ea0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
13eb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
13ec0 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65  llbackStmt(Btree
13ed0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
13ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
13ef0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13f00 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
13f10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13f20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13f30 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
13f40 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
13f50 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
13f60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
13f70 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  tRollback(pBt->p
13f80 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
13f90 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
13fa0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
13fb0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
13fc0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
13fd0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13fe0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13ff0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
14000 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
14010 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
14020 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
14030 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20  age.** iTable.  
14040 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69  The act of acqui
14050 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65  ring a cursor ge
14060 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ts a read lock o
14070 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
14080 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
14090 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
140a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
140b0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
140c0 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
140d0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
140e0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
140f0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
14100 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
14110 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
14120 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
14130 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
14140 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
14150 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
14160 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
14170 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
14180 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
14190 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
141a0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
141b0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
141c0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
141d0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
141e0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
141f0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
14200 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
14210 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
14220 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
14230 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
14240 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
14250 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
14260 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
14270 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
14280 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
14290 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
142a0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
142b0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
142c0 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
142d0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
142e0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
142f0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
14300 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
14310 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
14320 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
14330 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
14340 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
14350 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
14360 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
14370 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
14380 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
14390 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
143a0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
143b0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
143c0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
143d0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
143e0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
143f0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
14400 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
14410 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
14420 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
14430 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
14440 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
14450 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
14480 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
144b0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
144c0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
144d0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
14500 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
14510 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
14520 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
14530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
14540 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
14550 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
14560 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14570 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
14580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
14590 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
145a0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
145b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
145c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
145d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
145e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
145f0 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   );.  if( wrFlag
14600 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
14610 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14630 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
14640 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
14650 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
14660 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
14670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
14680 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KED;.    }.  }..
14690 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
146a0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
146b0 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
146c0 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
146d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
146e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
146f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14700 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
14710 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrFlag ){.     
14720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
14730 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
14740 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52   }.  pCur->pgnoR
14750 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
14760 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  le;.  if( iTable
14770 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50 61  ==1 && sqlite3Pa
14780 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
14790 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
147a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
147b0 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
147c0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
147d0 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
147e0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
147f0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
14800 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
14810 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
14820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14830 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
14840 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
14850 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
14860 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
14870 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
14880 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
14890 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
148a0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
148b0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
148c0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
148d0 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
148e0 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
148f0 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
14900 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
14910 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
14920 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
14930 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
14940 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
14950 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
14960 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
14970 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
14980 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
14990 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
149a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
149b0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
149c0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
149d0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
149e0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
149f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
14a00 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D;..  return SQL
14a10 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f  ITE_OK;..create_
14a20 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
14a30 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
14a40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14a50 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
14a60 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  }.  unlockBtreeI
14a70 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
14a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
14a90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14aa0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
14ae0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b10 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
14b20 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
14b30 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b60 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
14b70 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
14b80 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
14b90 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14bb0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
14bc0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
14bd0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
14c00 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
14c10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
14c20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14c30 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
14c40 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
14c50 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
14c60 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
14c70 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
14c80 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Cur);.  sqlite3B
14c90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14ca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
14cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14cc0 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20 72 65 74  sorSize(){.  ret
14cd0 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72  urn sizeof(BtCur
14ce0 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  sor);.}..../*.**
14cf0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
14d00 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
14d10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14d20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
14d30 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
14d40 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
14d50 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
14d60 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
14d70 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
14d80 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
14d90 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
14da0 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
14db0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
14dc0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
14dd0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
14de0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
14df0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
14e00 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
14e10 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
14e20 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
14e30 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
14e40 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
14e50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
14e60 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
14e70 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
14e80 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
14e90 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
14ea0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
14eb0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
14ec0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14ed0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
14ee0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
14ef0 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
14f00 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
14f10 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
14f20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
14f30 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
14f40 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
14f50 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
14f60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
14f70 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
14f80 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14f90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
14fa0 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
14fb0 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
14fc0 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
14fd0 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
14fe0 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
14ff0 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
15000 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
15010 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
15020 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
15030 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
15040 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
15050 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
15060 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
15070 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
15080 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70  pCur) );.  memcp
15090 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
150a0 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
150b0 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
150c0 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
150d0 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
150e0 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
150f0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
15100 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
15110 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44  mpCur->pPage->pD
15120 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
15130 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
15140 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
15150 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
15160 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
15170 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
15180 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
15190 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
151a0 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
151b0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
151c0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
151d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
151e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
151f0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
15200 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
15210 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
15220 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
15230 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
15240 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
15250 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
15260 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
15270 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
15280 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
15290 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
152a0 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
152b0 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  all.** sqlite3Bt
152c0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
152d0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
152e0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
152f0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
15300 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
15310 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
15320 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
15330 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
15340 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
15350 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
15360 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
15370 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
15380 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
15390 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
153a0 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
153b0 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
153c0 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
153d0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
153e0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
153f0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
15400 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
15410 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
15420 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
15430 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
15440 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
15450 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
15460 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
15470 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
15480 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
15490 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
154a0 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
154b0 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
154c0 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
154d0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
154e0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
154f0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
15500 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
15510 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
15520 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
15530 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15540 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15550 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
15560 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
15570 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
15580 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
15590 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
155a0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
155b0 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29  Cur->idx, &info)
155c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
155d0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
155e0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
155f0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
15600 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
15610 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15620 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
15630 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
15640 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
15650 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
15660 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
15670 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
15680 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
15690 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
156a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
156b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
156c0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
156d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
156e0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
156f0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
15700 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
15710 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
15720 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dNKey = 1;.    }
15730 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
15740 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
15750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
15760 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
15770 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
15780 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
15790 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
157a0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
157b0 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
157c0 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
157d0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15800 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
15810 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
15820 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
15830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
15860 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15870 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
15880 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e  ur->idx, &pCur->
15890 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 20 5c  info);         \
158a0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
158b0 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
158f0 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
15940 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15980 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
15990 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  C_VER */../*.** 
159a0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
159b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
159c0 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
159d0 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
159e0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
159f0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
15a00 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
15a10 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
15a20 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
15a30 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
15a40 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
15a50 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
15a60 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
15a70 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
15a80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
15a90 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
15aa0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
15ab0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
15ac0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
15ad0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
15ae0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
15af0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
15b00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15b10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15b20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15b30 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15b40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15b50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15b70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
15b80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15b90 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
15ba0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
15bb0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15bc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15bd0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15be0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
15bf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15c00 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
15c10 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
15c20 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
15c30 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
15c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15c50 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
15c60 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
15c70 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
15c80 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
15c90 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
15ca0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
15cb0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
15cc0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
15cd0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
15ce0 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
15cf0 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
15d00 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
15d10 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
15d20 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
15d30 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
15d40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15d50 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
15d60 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
15d70 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
15d80 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
15d90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
15da0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
15db0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15dc0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15dd0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15de0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15df0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15e00 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
15e30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15e40 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
15e50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
15e60 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15e70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15e80 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15e90 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
15ea0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
15eb0 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
15ec0 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
15ed0 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
15ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
15ef0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
15f00 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
15f10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
15f20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
15f30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15f40 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
15f50 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
15f60 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
15f70 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
15f80 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
15f90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
15fa0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
15fb0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
15fc0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
15fd0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
15fe0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
15ff0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
16000 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
16010 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
16020 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
16030 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
16040 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
16050 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
16060 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16070 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
16080 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
16090 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
160a0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rwise:.**.** Unl
160b0 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73  ess pPgnoNext is
160c0 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20   NULL, the page 
160d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
160e0 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  xt overflow .** 
160f0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
16100 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74  ed list is writt
16110 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
16120 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a  . If page ovfl.*
16130 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  * is the last pa
16140 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
16150 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
16160 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
16170 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
16180 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
16190 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
161a0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68  o the MemPage* h
161b0 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67  andle.** for pag
161c0 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65  e ovfl. The unde
161d0 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61 67  rlying pager pag
161e0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
161f0 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74  requested.** wit
16200 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  h the noContent 
16210 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65  flag set, so the
16220 20 70 61 67 65 20 64 61 74 61 20 61 63 63 65 73   page data acces
16230 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69  sable via.** thi
16240 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74  s handle may not
16250 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a   be trusted..*/.
16260 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
16270 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
16280 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
16290 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162b0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
162c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
162d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
162e0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
162f0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
16300 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
16310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16320 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
16330 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
16340 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
16350 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
16360 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16370 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
16380 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e  utex) );.  /* On
16390 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20  e of these must 
163a0 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68  not be NULL. Oth
163b0 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c  erwise, why call
163c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20   this function? 
163d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61  */.  assert(ppPa
163e0 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29  ge || pPgnoNext)
163f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f  ;..  /* If pPgno
16400 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
16410 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
16420 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
16430 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20   to obtain.  ** 
16440 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72  a MemPage* refer
16450 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61  ence only. No pa
16460 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69  ge-data is requi
16470 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  red in this case
16480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
16490 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72  gnoNext ){.    r
164a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
164b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
164c0 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  vfl, ppPage, 1);
164d0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
164e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
164f0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
16500 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
16510 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
16520 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
16530 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
16540 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
16550 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
16560 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16570 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
16580 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
16590 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
165a0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
165b0 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
165c0 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
165d0 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
165e0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
165f0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
16600 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
16610 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
16620 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
16630 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
16640 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
16650 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
16660 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
16670 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
16680 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
16690 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
166a0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
166b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
166c0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
166d0 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
166e0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
166f0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
16700 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
16710 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
16720 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
16730 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
16740 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
16750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16760 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16770 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
16780 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
16790 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
167a0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
167b0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
167c0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 7d   iGuess;.      }
167d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
167e0 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  f..  if( next==0
167f0 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20 20   || ppPage ){.  
16800 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
16810 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20   = 0;..    rc = 
16820 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16830 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
16840 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b  pPage, next!=0);
16850 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d  .    assert(rc==
16860 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
16870 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20  ge==0);.    if( 
16880 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53  next==0 && rc==S
16890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
168a0 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
168b0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
168c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
168d0 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  ppPage ){.      
168e0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
168f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16900 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16910 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
16920 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
16930 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  ext;..  return r
16940 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  c;.}../*.** Copy
16950 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
16960 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
16970 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
16980 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
16990 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
169a0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
169b0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
169c0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
169d0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
169e0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
169f0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
16a00 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
16a10 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
16a20 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
16a30 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
16a40 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
16a50 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
16a60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
16a70 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
16a80 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
16a90 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
16aa0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
16ab0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
16ac0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
16ad0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
16ae0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
16af0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
16b00 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
16b10 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
16b20 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
16b30 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
16b40 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16b50 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
16b60 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
16b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16b80 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
16b90 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
16bc0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
16bd0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
16be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
16bf0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
16c00 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
16c10 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
16c20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
16c30 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
16c40 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
16c50 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
16c60 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
16c70 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
16c80 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
16c90 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
16ca0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
16cb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
16cc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
16cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16cf0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
16d00 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
16d10 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
16d20 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
16d30 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
16d40 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
16d50 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
16d60 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
16d70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
16d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16db0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
16dc0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
16dd0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
16de0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
16df0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
16e00 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
16e10 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
16e20 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
16e30 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
16e40 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
16e50 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
16e60 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
16e70 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
16e80 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
16e90 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
16ea0 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
16eb0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
16ec0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
16ed0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
16ee0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
16ef0 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
16f00 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
16f10 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
16f20 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f..**.** This ro
16f30 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d  utine does not m
16f40 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f  ake a distinctio
16f50 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e  n between key an
16f60 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75  d data..** It ju
16f70 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69 74  st reads or writ
16f80 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68  es bytes from th
16f90 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20  e payload area. 
16fa0 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20   Data might .** 
16fb0 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
16fc0 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73 63  in page or be sc
16fd0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
16fe0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
16ff0 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a   .** pages..**.*
17000 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
17010 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
17020 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
17030 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
17040 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
17050 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
17060 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
17070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
17080 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
17090 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
170a0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
170b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
170c0 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
170d0 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
170e0 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
170f0 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
17100 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
17110 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
17120 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
17130 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
17140 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
17150 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
17160 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
17170 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
17180 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
17190 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
171a0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
171b0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
171c0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
171d0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
171e0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
171f0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
17200 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
17210 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
17220 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
17230 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
17240 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
17250 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
17260 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
17270 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
17280 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
17290 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
172a0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
172b0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
172c0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
172d0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
172e0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
172f0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
17300 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
17310 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
17320 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
17330 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
17340 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f   from */.  int o
17350 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
17360 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
17370 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
17380 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20  ayload */.  int 
17390 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
173a0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
173b0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
173c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
173d0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
173e0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
173f0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
17400 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20 20   skipKey,       
17410 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69    /* offset begi
17420 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ns at data if th
17430 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20  is is true */.  
17440 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
17450 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
17460 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
17470 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
17480 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17490 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
174a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
174b0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e    u32 nKey;.  in
174c0 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
174d0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
174e0 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20  Cur->pPage;     
174f0 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
17500 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
17510 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
17520 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
17530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
17540 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
17550 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
17560 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
17570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
17580 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
17590 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
175a0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
175b0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
175c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
175d0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
175e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
175f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
17600 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
17610 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
17620 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
17630 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
17640 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
17650 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
17660 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
17670 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  : pCur->info.nKe
17680 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b  y);..  if( skipK
17690 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
176a0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
176b0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
176c0 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
176d0 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a  .nData ){.    /*
176e0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
176f0 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
17700 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
17710 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
17720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17730 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
17740 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
17750 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
17760 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
17770 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
17780 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
17790 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
177a0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
177b0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
177c0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
177d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
177e0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
177f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
17800 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
17810 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
17820 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
17830 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
17840 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
17850 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
17860 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
17870 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
17880 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
17890 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
178a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
178b0 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  .  pBt = pCur->p
178c0 42 74 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  Bt;.  if( rc==SQ
178d0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
178e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
178f0 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  t ovflSize = pBt
17900 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
17910 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
17920 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
17930 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
17940 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
17950 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
17960 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
17970 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
17980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17990 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
179a0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
179b0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
179c0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
179d0 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
179e0 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
179f0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
17a00 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
17a10 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
17a20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
17a30 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
17a40 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
17a50 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
17a60 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
17a70 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
17a80 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
17a90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
17aa0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
17ab0 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
17ac0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
17ad0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
17ae0 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
17af0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
17b00 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
17b10 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
17b20 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
17b30 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
17b40 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
17b50 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
17b60 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
17b70 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
17b80 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
17b90 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
17ba0 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
17bb0 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
17bc0 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
17bd0 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
17be0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
17bf0 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
17c00 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70   if( nOvfl && !p
17c10 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
17c20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
17c30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
17c40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
17c50 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
17c60 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
17c70 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
17c80 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
17c90 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
17ca0 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
17cb0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
17cc0 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
17cd0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
17ce0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
17cf0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
17d00 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
17d10 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
17d20 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
17d30 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
17d40 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
17d50 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
17d60 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
17d70 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
17d80 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
17d90 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ize);.    }.#end
17da0 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72  if..    for( ; r
17db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17dc0 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
17dd0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66  e; iIdx++){..#if
17de0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17df0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
17e00 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
17e10 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
17e20 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
17e30 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
17e40 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
17e50 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  low ){.        a
17e60 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
17e70 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
17e80 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
17e90 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
17ea0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
17eb0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
17ec0 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
17ed0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
17ee0 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
17ef0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
17f00 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
17f10 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
17f20 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
17f30 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
17f40 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
17f50 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
17f60 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
17f70 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
17f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
17f90 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
17fa0 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
17fb0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
17fc0 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
17fd0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17fe0 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
17ff0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
18000 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
18010 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
18020 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
18030 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18040 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
18050 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
18060 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
18070 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18080 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
18090 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
180a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
180b0 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
180c0 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20   else .#endif.  
180d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
180e0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
180f0 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
18100 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
18110 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
18120 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
18130 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
18140 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
18150 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
18160 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
18170 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
18180 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
18190 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
181a0 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
181b0 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
181c0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
181d0 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
181e0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
181f0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
18200 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18210 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
18220 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
18230 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18240 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18260 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
18270 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
18280 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18290 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
182a0 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
182b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
182c0 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
182d0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
182e0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
182f0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
18300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18310 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
18320 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
18330 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
18340 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
18350 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18360 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
18370 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
18380 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
18390 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
183a0 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20  .          pBuf 
183b0 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += a;.        }.
183c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
183d0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
183e0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
183f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18400 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18410 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
18420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
18430 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
18440 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
18450 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
18460 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
18470 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
18480 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
18490 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
184a0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
184b0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
184c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
184d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
184e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
184f0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
18500 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
18510 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
18520 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
18530 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
18540 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
18550 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
18560 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
18570 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18580 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
18590 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
185a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
185b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
185c0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
185d0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
185e0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
185f0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
18600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18610 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18620 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18630 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
18640 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18650 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 69  Page!=0 );.    i
18660 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
18670 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
18680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18690 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
186a0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
186b0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
186c0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
186d0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
186e0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
186f0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
18700 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
18710 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
18720 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
18730 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
18740 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 0, 0);.  }. 
18750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18760 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
18770 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
18780 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
18790 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
187a0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
187b0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
187c0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
187d0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
187e0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
187f0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
18800 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18810 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
18820 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
18830 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18840 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
18850 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
18860 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
18870 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
18880 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
18890 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
188a0 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
188b0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
188c0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
188d0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
188e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
188f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
18900 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
18910 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
18920 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18930 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18950 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18960 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18970 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18980 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18990 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
189a0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
189b0 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
189c0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
189d0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
189e0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
189f0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
18a00 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
18a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18a20 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
18a30 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
18a40 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
18a50 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
18a60 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
18a70 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
18a80 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
18a90 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
18aa0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
18ab0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
18ac0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
18ad0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18ae0 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
18af0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
18b00 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18b10 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
18b20 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
18b30 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
18b40 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
18b50 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
18b60 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
18b70 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
18b80 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
18b90 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
18ba0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
18bb0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
18bc0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
18bd0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
18be0 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
18bf0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
18c00 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
18c10 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
18c20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
18c30 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
18c40 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
18c50 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
18c60 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
18c70 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
18c80 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
18c90 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
18ca0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
18cb0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
18cc0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
18cd0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79  ed to reassembly
18ce0 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
18cf0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
18d00 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
18d10 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
18d20 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
18d30 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
18d40 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
18d50 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
18d60 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
18d70 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
18d80 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
18d90 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
18da0 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
18db0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
18dc0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
18dd0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
18de0 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
18df0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
18e00 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
18e10 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
18e20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
18e30 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
18e40 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
18e50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
18e60 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
18e70 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
18e80 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
18e90 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
18ea0 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
18eb0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
18ec0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
18ed0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
18ee0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
18ef0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
18f00 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   int nLocal;..  
18f10 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
18f20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  && pCur->pPage!=
18f30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18f40 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18f50 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
18f60 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18f70 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18f80 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
18f90 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
18fa0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
18fb0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
18fc0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65  e->nCell );.  ge
18fd0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
18fe0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
18ff0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
19000 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
19010 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
19020 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
19030 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
19040 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
19050 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d      nKey = pCur-
19060 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
19070 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
19080 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
19090 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
190a0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
190b0 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
190c0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
190d0 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
190e0 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e  Local;.    if( n
190f0 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20  Local>nKey ){.  
19100 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65      nLocal = nKe
19110 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  y;.    }.  }.  *
19120 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
19130 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
19140 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
19150 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
19160 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
19170 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
19180 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
19190 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
191a0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
191b0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
191c0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
191d0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
191e0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
191f0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
19200 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
19210 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
19220 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
19230 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
19240 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
19250 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
19260 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
19270 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
19280 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
19290 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
192a0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
192b0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
192c0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
192d0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
192e0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
192f0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
19300 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
19310 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
19320 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
19330 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
19340 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
19350 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
19360 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
19370 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
19380 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
19390 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
193a0 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
193b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
193c0 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
193d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
193e0 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
193f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
19400 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
19410 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20    return (const 
19420 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
19430 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
19440 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19450 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  0;.}.const void 
19460 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
19470 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
19480 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
19490 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
194a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
194b0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
194c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
194d0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
194e0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
194f0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
19500 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
19510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
19520 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
19530 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
19540 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
19550 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
19560 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
19570 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
19580 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
19590 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
195a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
195b0 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
195c0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
195d0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
195e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
195f0 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
19600 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68  pOldPage;.  BtSh
19610 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
19620 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
19630 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19640 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
19650 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
19660 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19670 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   );.  rc = getAn
19680 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
19690 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
196a0 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  e, pCur->pPage);
196b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
196c0 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67  rn rc;.  pNewPag
196d0 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70  e->idxParent = p
196e0 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64  Cur->idx;.  pOld
196f0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
19700 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e  ge;.  pOldPage->
19710 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
19720 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64  releasePage(pOld
19730 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Page);.  pCur->p
19740 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b  Page = pNewPage;
19750 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
19760 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
19770 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
19780 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
19790 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
197a0 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20  >nCell<1 ){.    
197b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
197c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
197d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
197e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
197f0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
19800 70 61 67 65 20 69 73 20 74 68 65 20 76 69 72 74  page is the virt
19810 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20  ual root of its 
19820 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
19830 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
19840 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
19850 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62  age for most tab
19860 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72  les.  But.** for
19870 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
19880 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d  d on page 1, som
19890 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72  etime the real r
198a0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65  oot page.** is e
198b0 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f 72 20  mpty except for 
198c0 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
198d0 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65  r.  In such case
198e0 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  s the.** virtual
198f0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
19900 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
19910 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
19920 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f   page.** 1 is po
19930 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
19940 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
19950 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65  RootPage(MemPage
19960 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50   *pPage){.  MemP
19970 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20  age *pParent;.. 
19980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19990 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
199a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
199b0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
199c0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
199d0 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29  if( pParent==0 )
199e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
199f0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31   pParent->pgno>1
19a00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19a10 66 28 20 67 65 74 32 62 79 74 65 28 26 70 50 61  f( get2byte(&pPa
19a20 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
19a30 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  ent->hdrOffset+3
19a40 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
19a50 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
19a60 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
19a70 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
19a80 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
19a90 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
19aa0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
19ab0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
19ac0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
19ad0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
19ae0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
19af0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
19b00 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
19b10 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
19b20 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
19b30 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
19b40 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
19b50 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
19b60 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
19b70 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
19b80 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
19b90 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
19ba0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
19bb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19bc0 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e  ;.  int idxParen
19bd0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
19be0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19bf0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
19c00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19c10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19c20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
19c30 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
19c40 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
19c50 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 42  ssert( !sqlite3B
19c60 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
19c70 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65  Page) );.  pPare
19c80 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
19c90 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
19ca0 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
19cb0 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  dxParent = pPage
19cc0 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73  ->idxParent;.  s
19cd0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
19ce0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
19cf0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
19d00 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
19d10 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
19d20 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
19d30 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
19d40 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
19d50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
19d60 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29  t->idxShift==0 )
19d70 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20  ;.  pCur->idx = 
19d80 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a  idxParent;.}../*
19d90 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
19da0 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  sor to the root 
19db0 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  page.*/.static i
19dc0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
19dd0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
19de0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
19df0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19e00 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
19e10 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
19e20 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
19e30 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
19e40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
19e50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
19e60 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
19e70 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
19e80 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
19e90 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
19ea0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
19eb0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
19ec0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
19ed0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
19ee0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
19ef0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
19f00 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
19f10 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
19f20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19f30 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
19f40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19f50 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20   pCur->skip;.   
19f60 20 7d 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73   }.    clearCurs
19f70 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
19f80 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
19f90 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
19fa0 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f  f( pRoot && pRoo
19fb0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
19fc0 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61  gnoRoot ){.    a
19fd0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
19fe0 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  Init );.  }else{
19ff0 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20 20 20  .    if( .      
1a000 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
1a010 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
1a020 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
1a030 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29  oot, &pRoot, 0))
1a040 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
1a050 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1a060 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1a070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a080 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
1a090 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
1a0a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
1a0b0 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20  e = pRoot;.  }. 
1a0c0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
1a0d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1a0e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1a0f0 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
1a100 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1a110 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  0;.  if( pRoot->
1a120 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
1a130 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
1a140 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
1a150 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1a160 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20  >pgno==1 );.    
1a170 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
1a180 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
1a190 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
1a1a0 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
1a1b0 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a  t( subpage>0 );.
1a1c0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1a1d0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
1a1e0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1a1f0 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
1a200 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  age);.  }.  pCur
1a210 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 43 75  ->eState = ((pCu
1a220 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  r->pPage->nCell>
1a230 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
1a240 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
1a250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a260 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a270 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1a280 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1a290 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1a2a0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
1a2b0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1a2c0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
1a2d0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
1a2e0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
1a2f0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
1a300 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
1a310 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
1a320 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1a330 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a340 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
1a350 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1a360 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1a370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a380 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1a390 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a3a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a3b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a3c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a3d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1a3e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1a3f0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1a400 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
1a410 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
1a420 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1a430 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
1a440 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
1a450 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1a460 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
1a470 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20   pCur->idx));.  
1a480 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a490 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a4a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a4b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1a4c0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1a4d0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
1a4e0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
1a4f0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
1a500 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1a510 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1a520 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
1a530 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
1a540 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
1a550 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
1a560 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
1a570 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
1a580 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
1a590 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1a5a0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
1a5b0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
1a5c0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
1a5d0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
1a5e0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1a5f0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
1a600 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
1a610 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
1a620 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
1a630 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
1a640 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
1a650 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1a660 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a670 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
1a680 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1a690 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1a6a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a6b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1a6c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1a6d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1a6e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1a6f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a700 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a710 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1a720 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1a730 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
1a740 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
1a750 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1a760 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1a770 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1a780 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1a790 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
1a7a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1a7b0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1a7c0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1a7d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1a7e0 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65  Cur->idx = pPage
1a7f0 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20  ->nCell - 1;.   
1a800 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1a810 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1a820 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1a830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1a840 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
1a850 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1a860 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1a870 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1a880 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1a890 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1a8a0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1a8b0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1a8c0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1a8d0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1a8e0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1a8f0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1a900 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1a910 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
1a920 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1a930 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1a940 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1a950 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1a960 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1a970 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a980 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1a990 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1a9a0 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
1a9b0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1a9c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a9d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
1a9e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a9f0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1aa00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1aa10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1aa20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1aa30 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   1;.      rc = S
1aa40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1aa50 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1aa60 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1aa70 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
1aa80 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1aa90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1aaa0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1aab0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1aac0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1aad0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1aae0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1aaf0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1ab00 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1ab10 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1ab20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1ab30 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1ab40 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1ab50 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1ab60 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1ab70 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1ab80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ab90 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
1aba0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1abb0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1abc0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
1abd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1abe0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1abf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1ac00 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1ac10 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1ac20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1ac30 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1ac40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ac50 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
1ac60 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1ac70 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
1ac80 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1ac90 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1aca0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1acb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1acc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1acd0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1ace0 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
1acf0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
1ad00 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1ad10 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67  t(pCur);.      g
1ad20 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1ad30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
1ad40 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
1ad50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1ad60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ad70 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1ad80 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
1ad90 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
1ada0 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
1adb0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
1adc0 4b 65 79 2f 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e  Key/nKey/pUnKey.
1add0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1ade0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1adf0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1ae00 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70   only the nKey p
1ae10 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
1ae20 2e 20 20 70 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  .  pKey .** and 
1ae30 70 55 6e 4b 65 79 20 6d 75 73 74 20 62 65 20 4e  pUnKey must be N
1ae40 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
1ae50 74 61 62 6c 65 73 2c 20 65 69 74 68 65 72 20 70  tables, either p
1ae60 55 6e 4b 65 79 0a 2a 2a 20 6d 75 73 74 20 70 6f  UnKey.** must po
1ae70 69 6e 74 20 74 6f 20 61 20 6b 65 79 20 74 68 61  int to a key tha
1ae80 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1ae90 65 6e 20 75 6e 70 61 63 6b 65 64 2c 20 6f 72 20  en unpacked, or 
1aea0 65 6c 73 65 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65  else.** pKey/nKe
1aeb0 79 20 64 65 73 63 72 69 62 65 73 20 61 20 62 6c  y describes a bl
1aec0 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ob containing th
1aed0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e key..**.** If 
1aee0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1aef0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1af00 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1af10 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1af20 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1af30 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1af40 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1af50 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1af60 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1af70 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1af80 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1af90 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1afa0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1afb0 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ey..**.** The re
1afc0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
1afd0 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
1afe0 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
1aff0 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  h the.** cursor 
1b000 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
1b010 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c  Res if pRes!=NUL
1b020 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  L.  The meaning 
1b030 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65  of.** this value
1b040 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1b050 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
1b060 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1b070 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1b080 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1b090 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1b0a0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
1b0b0 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20  er than pKey or 
1b0c0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1b0d0 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
1b0e0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
1b0f0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
1b100 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
1b110 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
1b120 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
1b130 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1b140 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1b150 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1b160 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b170 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
1b180 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a  ches pKey..**.**
1b190 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1b1a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b1b0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b1c0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b1d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b1e0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1b1f0 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  n pKey..**.*/.in
1b200 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1b210 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
1b220 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f   *pCur,        /
1b230 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1b240 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f  be moved */.  co
1b250 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1b260 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
1b270 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69  content for indi
1b280 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62  ces.  Not used b
1b290 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 55 6e  y tables */.  Un
1b2a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
1b2b0 6e 4b 65 79 2c 2f 2a 20 55 6e 70 61 63 6b 65 64  nKey,/* Unpacked
1b2c0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79   version of pKey
1b2d0 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b2f0 53 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f  Size of pKey.  O
1b300 72 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61  r the key for ta
1b310 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  bles */.  int bi
1b320 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
1b330 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
1b340 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
1b350 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
1b360 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
1b370 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
1b380 63 68 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a  ch result flag *
1b390 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1b3a0 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30   char aSpace[200
1b3b0 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  ];..  assert( cu
1b3c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b3d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1b3e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b3f0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1b400 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1b410 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1b420 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
1b430 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
1b440 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
1b450 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
1b460 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
1b470 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1b480 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
1b490 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
1b4a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b4b0 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69  ID && pCur->vali
1b4c0 64 4e 4b 65 79 20 26 26 20 70 43 75 72 2d 3e 70  dNKey && pCur->p
1b4d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1b4e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1b4f0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b  fo.nKey==nKey ){
1b500 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1b510 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b530 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
1b540 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
1b550 66 6f 2e 6e 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a  fo.nKey<nKey ){.
1b560 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
1b570 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b590 20 20 7d 0a 0a 0a 20 20 72 63 20 3d 20 6d 6f 76    }...  rc = mov
1b5a0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1b5b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1b5c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1b5d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1b5e0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1b5f0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73   pCur->pPage->is
1b600 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43  Init );.  if( pC
1b610 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b620 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1b630 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
1b640 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b650 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1b660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1b680 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  f( pCur->pPage->
1b690 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
1b6a0 20 57 65 20 61 72 65 20 67 69 76 65 6e 20 61 6e   We are given an
1b6b0 20 53 51 4c 20 74 61 62 6c 65 20 74 6f 20 73 65   SQL table to se
1b6c0 61 72 63 68 2e 20 20 54 68 65 20 6b 65 79 20 69  arch.  The key i
1b6d0 73 20 74 68 65 20 69 6e 74 65 67 65 72 0a 20 20  s the integer.  
1b6e0 20 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6e 74 61    ** rowid conta
1b6f0 69 6e 65 64 20 69 6e 20 6e 4b 65 79 2e 20 20 70  ined in nKey.  p
1b700 4b 65 79 20 61 6e 64 20 70 55 6e 4b 65 79 20 73  Key and pUnKey s
1b710 68 6f 75 6c 64 20 62 6f 74 68 20 62 65 20 4e 55  hould both be NU
1b720 4c 4c 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  LL */.    assert
1b730 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20  ( pUnKey==0 );. 
1b740 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d     assert( pKey=
1b750 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  =0 );.  }else if
1b760 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20  ( pUnKey==0 ){. 
1b770 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20     /* We are to 
1b780 73 65 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e  search an SQL in
1b790 64 65 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20  dex using a key 
1b7a0 65 6e 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f  encoded as a blo
1b7b0 62 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 6c  b..    ** The bl
1b7c0 6f 62 20 69 73 20 66 6f 75 6e 64 20 61 74 20 70  ob is found at p
1b7d0 4b 65 79 20 61 6e 64 20 69 73 20 6e 4b 65 79 20  Key and is nKey 
1b7e0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
1b7f0 20 20 55 6e 70 61 63 6b 0a 20 20 20 20 2a 2a 20    Unpack.    ** 
1b800 74 68 69 73 20 6b 65 79 20 73 6f 20 74 68 61 74  this key so that
1b810 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 20   we can use it. 
1b820 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1b830 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 70 55  Key!=0 );.    pU
1b840 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  nKey = sqlite3Vd
1b850 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
1b860 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e  Cur->pKeyInfo, n
1b870 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
1b8a0 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
1b8b0 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
1b8c0 55 6e 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  UnKey==0 ) retur
1b8d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1b8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b8f0 57 65 20 61 72 65 20 74 6f 20 73 65 61 72 63 68  We are to search
1b900 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 75 73   an SQL index us
1b910 69 6e 67 20 61 20 6b 65 79 20 74 68 61 74 20 69  ing a key that i
1b920 73 20 61 6c 72 65 61 64 79 20 75 6e 70 61 63 6b  s already unpack
1b930 65 64 0a 20 20 20 20 2a 2a 20 61 6e 64 20 68 61  ed.    ** and ha
1b940 6e 64 65 64 20 74 6f 20 75 73 20 69 6e 20 70 55  nded to us in pU
1b950 6e 4b 65 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  nKey. */.    ass
1b960 65 72 74 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a  ert( pKey==0 );.
1b970 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20    }.  for(;;){. 
1b980 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1b990 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1b9a0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1b9b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1b9c0 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1b9d0 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1b9e0 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1b9f0 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1ba00 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1ba10 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1ba20 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1ba30 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1ba40 79 20 26 26 20 70 55 6e 4b 65 79 3d 3d 30 20 29  y && pUnKey==0 )
1ba50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1ba60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ba70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
1ba80 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1ba90 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69  }.    if( biasRi
1baa0 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ght ){.      pCu
1bab0 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20  r->idx = upr;.  
1bac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1bad0 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b  Cur->idx = (upr+
1bae0 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20  lwr)/2;.    }.  
1baf0 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29    if( lwr<=upr )
1bb00 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
1bb10 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
1bb20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
1bb30 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ey;.      pCur->
1bb40 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1bb50 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
1bb60 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
1bb70 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1bb80 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ey ){.        u8
1bb90 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20   *pCell;.       
1bba0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
1bbb0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1bbc0 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
1bbd0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
1bbe0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
1bbf0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
1bc00 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1bc10 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
1bc20 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
1bc30 6c 6c 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ll, &dummy);.   
1bc40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1bc50 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
1bc60 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
1bc70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
1bc80 65 6c 6c 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a  ellKey==nKey ){.
1bc90 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
1bca0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1bcb0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79  f( nCellKey<nKey
1bcc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1bcd0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1bce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
1bcf0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e  ssert( nCellKey>
1bd00 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  nKey );.        
1bd10 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
1bd20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1bd30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76 61  .        int ava
1bd40 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  ilable;.        
1bd50 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64  pCellKey = (void
1bd60 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28   *)fetchPayload(
1bd70 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65  pCur, &available
1bd80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  , 0);.        nC
1bd90 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69  ellKey = pCur->i
1bda0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
1bdb0 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e    if( available>
1bdc0 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20  =nCellKey ){.   
1bdd0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
1bde0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1bdf0 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43  are(nCellKey, pC
1be00 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b  ellKey, pUnKey);
1be10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1be20 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
1be30 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ey = sqlite3_mal
1be40 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  loc( nCellKey );
1be50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1be60 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
1be70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1be80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1be90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1bea0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1beb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1bed0 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
1bee0 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64   nCellKey, (void
1bef0 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20   *)pCellKey);.  
1bf00 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1bf10 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1bf20 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70  pare(nCellKey, p
1bf30 43 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b 65 79 29  CellKey, pUnKey)
1bf40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1bf50 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
1bf60 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1bf70 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
1bf80 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1bf90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bfa0 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
1bfb0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
1bfc0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
1bfd0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
1bfe0 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1bff0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1c000 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1c010 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20  = pCur->idx;.   
1c020 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1c030 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1c040 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1c050 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c060 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1c070 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1c080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c090 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1c0a0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c0c0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
1c0d0 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70  .        lwr = p
1c0e0 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20  Cur->idx+1;.    
1c0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c100 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   upr = pCur->idx
1c110 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1c120 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
1c130 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
1c140 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
1c150 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Key;.        bre
1c160 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c170 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c    pCur->idx = (l
1c180 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d  wr+upr)/2;.    }
1c190 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
1c1a0 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
1c1b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1c1c0 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
1c1d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1c1e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
1c1f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1c200 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
1c210 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1c220 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1c230 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1c240 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1c250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c260 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1c270 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1c280 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
1c290 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
1c2a0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1c2b0 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1c2c0 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
1c2d0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
1c2e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1c2f0 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20  s ) *pRes = c;. 
1c300 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c310 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
1c320 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c330 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
1c340 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43  dx = lwr;.    pC
1c350 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1c360 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1c370 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20  lidNKey = 0;.   
1c380 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1c390 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
1c3a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1c3b0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c3c0 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
1c3d0 69 73 68 3a 0a 20 20 69 66 28 20 70 4b 65 79 20  ish:.  if( pKey 
1c3e0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  ){.    /* If we 
1c3f0 63 72 65 61 74 65 64 20 6f 75 72 20 6f 77 6e 20  created our own 
1c400 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 61 74 20  unpacked key at 
1c410 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 0a  the top of this.
1c420 20 20 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65      ** procedure
1c430 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74  , then destroy t
1c440 68 61 74 20 6b 65 79 20 62 65 66 6f 72 65 20 72  hat key before r
1c450 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20  eturning. */.   
1c460 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
1c470 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
1c480 28 70 55 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20  (pUnKey);.  }.  
1c490 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c4a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1c4b0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1c4c0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
1c4d0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
1c4e0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
1c4f0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
1c500 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
1c510 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
1c520 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
1c530 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
1c540 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1c550 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
1c560 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
1c570 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
1c580 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
1c590 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
1c5a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1c5b0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1c5c0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
1c5d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
1c5e0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
1c5f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
1c600 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1c610 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
1c620 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
1c630 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
1c640 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
1c650 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
1c660 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
1c670 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
1c680 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
1c690 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
1c6a0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
1c6b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
1c6c0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
1c6d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c6e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1c6f0 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20  tion handle for 
1c700 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c  a cursor..*/.sql
1c710 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72  ite3 *sqlite3Btr
1c720 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74  eeCursorDb(const
1c730 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29   BtCursor *pCur)
1c740 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1c750 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c760 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1c770 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
1c780 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65  urn pCur->pBtree
1c790 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ->db;.}../*.** A
1c7a0 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
1c7b0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1c7c0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1c7d0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1c7e0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1c7f0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1c800 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1c810 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1c820 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1c830 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1c840 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1c850 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1c860 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1c870 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63  Res=1..*/.static
1c880 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
1c890 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c8a0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1c8b0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1c8c0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1c8d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c8e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1c8f0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1c900 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1c910 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1c920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c940 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
1c950 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
1c960 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
1c970 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1c980 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1c990 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1c9a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c9b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1c9c0 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29  ( pCur->skip>0 )
1c9d0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1c9e0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1c9f0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1ca00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1ca10 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1ca20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1ca30 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1ca40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1ca50 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1ca60 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ..  pCur->idx++;
1ca70 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1ca80 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1ca90 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1caa0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e    if( pCur->idx>
1cab0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
1cac0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1cad0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1cae0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1caf0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
1cb00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1cb10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1cb20 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
1cb30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1cb40 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1cb50 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1cb60 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1cb70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cb80 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
1cb90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1cba0 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28  BtreeIsRootPage(
1cbb0 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  pPage) ){.      
1cbc0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1cbd0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1cbe0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1cbf0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
1cc00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1cc10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1cc20 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
1cc30 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
1cc40 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1cc50 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c  pPage;.    }whil
1cc60 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50  e( pCur->idx>=pP
1cc70 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1cc80 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1cc90 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1cca0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63  Data ){.      rc
1ccb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
1ccc0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
1ccd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ccf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1cd00 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52  rn rc;.  }.  *pR
1cd10 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
1cd20 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1cd30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cd40 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f  K;.  }.  rc = mo
1cd50 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1cd60 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1cd70 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
1cd80 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
1cd90 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1cda0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1cdb0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1cdc0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1cdd0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4e 65  ;.  rc = btreeNe
1cde0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1cdf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ce00 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
1ce10 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
1ce20 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
1ce30 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
1ce40 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1ce50 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1ce60 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1ce70 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1ce80 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1ce90 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
1cea0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1ceb0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1cec0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1ced0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1cee0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1cef0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1cf00 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
1cf10 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1cf20 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1cf30 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65   Pgno pgno;.  Me
1cf40 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1cf50 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1cf60 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1cf70 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1cf80 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
1cf90 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1cfa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cfb0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1cfc0 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
1cfd0 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
1cfe0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1cff0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1d000 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1d010 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d020 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1d030 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b   pCur->skip<0 ){
1d040 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1d050 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1d060 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1d070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d080 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1d090 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1d0a0 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
1d0b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1d0c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d0d0 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69  r->idx>=0 );.  i
1d0e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1d0f0 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
1d100 74 34 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c  t4byte( findCell
1d110 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
1d120 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  x) );.    rc = m
1d130 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1d140 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
1d150 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1d160 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d170 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1d180 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
1d190 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1d1a0 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b   pCur->idx==0 ){
1d1b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1d1c0 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1d1d0 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1d1e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1d1f0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1d200 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
1d210 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
1d220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d240 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1d250 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1d260 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1d270 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20  ->pPage;.    }. 
1d280 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a     pCur->idx--;.
1d290 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1d2a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1d2b0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1d2c0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1d2d0 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1d2e0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1d2f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d300 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
1d310 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1d320 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1d330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d340 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
1d350 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1d360 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1d370 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
1d380 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1d390 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1d3a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d3b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d3c0 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
1d3d0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
1d3e0 70 52 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pRes);.  return 
1d3f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
1d400 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1d410 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1d420 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
1d430 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
1d440 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
1d450 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1d460 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
1d470 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
1d480 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1d490 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1d4a0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
1d4b0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
1d4c0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
1d4d0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
1d4e0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
1d4f0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
1d500 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1d510 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
1d520 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
1d530 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
1d540 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d550 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
1d560 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
1d570 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1d580 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
1d590 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
1d5a0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
1d5b0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
1d5c0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
1d5d0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
1d5e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1d5f0 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
1d600 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1d610 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1d620 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
1d630 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
1d640 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
1d650 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1d660 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
1d670 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
1d680 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
1d690 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
1d6a0 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
1d6b0 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
1d6c0 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
1d6d0 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
1d6e0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
1d6f0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
1d700 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
1d710 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
1d720 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
1d730 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
1d740 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1d750 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
1d760 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
1d770 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
1d780 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
1d790 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
1d7a0 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
1d7b0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
1d7c0 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
1d7d0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1d7e0 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
1d7f0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
1d800 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1d810 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1d820 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1d830 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
1d840 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
1d850 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
1d860 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
1d870 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
1d880 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
1d890 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
1d8a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d8b0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1d8c0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
1d8d0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
1d8e0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
1d8f0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
1d900 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
1d910 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
1d920 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
1d930 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20  evTrunk = 0;..  
1d940 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d950 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1d960 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
1d970 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1d980 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1d990 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1d9a0 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20  36]);.  if( n>0 
1d9b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
1d9c0 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
1d9d0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
1d9e0 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
1d9f0 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
1da00 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
1da10 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1da20 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
1da30 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
1da40 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
1da50 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
1da60 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
1da70 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
1da80 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
1da90 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
1daa0 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
1dab0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
1dac0 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
1dad0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1dae0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
1daf0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
1db00 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
1db10 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
1db20 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
1db30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1db40 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1db50 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c  exact && nearby<
1db60 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
1db70 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
1db80 65 72 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20  er) ){.      u8 
1db90 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  eType;.      ass
1dba0 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
1dbb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1dbc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1dbd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
1dbe0 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
1dbf0 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
1dc00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1dc10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1dc20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1dc30 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1dc40 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1dc50 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1dc60 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61      *pPgno = nea
1dc70 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rby;.    }.#endi
1dc80 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
1dc90 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
1dca0 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
1dcb0 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
1dcc0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
1dcd0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
1dce0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
1dcf0 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
1dd00 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
1dd10 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1dd20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1dd30 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1dd40 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1dd50 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
1dd60 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1dd70 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
1dd80 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
1dd90 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
1dda0 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
1ddb0 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
1ddc0 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
1ddd0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
1dde0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
1ddf0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
1de00 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
1de10 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
1de20 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
1de30 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
1de40 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f   located..    */
1de50 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1de60 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
1de70 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
1de80 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1de90 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
1dea0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
1deb0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
1dec0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ded0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
1dee0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1def0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
1df00 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
1df10 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1df20 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
1df30 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1df40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1df50 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1df60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1df70 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1df80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b        }..      k
1df90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1dfa0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
1dfb0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
1dfc0 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
1dfd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1dfe0 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
1dff0 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
1e000 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
1e010 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
1e020 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
1e030 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
1e040 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
1e050 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
1e060 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
1e070 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
1e080 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
1e090 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
1e0a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e0b0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1e0c0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1e0d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1e0e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1e0f0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1e100 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e110 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
1e120 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
1e130 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1e140 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1e150 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1e160 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1e170 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1e180 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1e190 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
1e1a0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
1e1b0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
1e1c0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
1e1d0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
1e1e0 73 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73  se if( k>pBt->us
1e1f0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
1e200 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
1e210 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
1e220 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
1e230 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
1e240 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e250 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e260 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
1e270 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1e280 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1e290 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e2a0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
1e2b0 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
1e2c0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
1e2d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1e2e0 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
1e2f0 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
1e300 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
1e310 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1e320 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
1e330 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
1e340 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
1e350 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
1e360 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e370 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
1e380 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1e390 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1e3a0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1e3b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
1e3c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e3d0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
1e3e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1e3f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1e400 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e410 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1e420 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
1e430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1e440 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1e450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e460 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1e470 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1e480 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1e490 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1e4a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
1e4b0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
1e4c0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
1e4d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1e4e0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
1e4f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e500 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e510 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
1e520 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
1e530 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
1e540 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
1e550 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
1e560 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
1e570 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
1e580 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
1e590 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
1e5a0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1e5b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1e5c0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1e5d0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
1e5e0 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
1e5f0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1e600 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
1e610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1e620 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1e630 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
1e640 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
1e650 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1e660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e670 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1e680 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e690 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1e6a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
1e6b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e6c0 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
1e6d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e6e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e6f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e700 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e710 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
1e720 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1e730 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e740 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e750 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1e760 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1e770 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
1e780 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1e790 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e7a0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1e7b0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
1e7c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1e7d0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
1e7e0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1e7f0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
1e800 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1e810 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1e820 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e830 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
1e840 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1e850 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1e860 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
1e870 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
1e880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1e890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e8a0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
1e8b0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1e8c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e8e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1e8f0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1e900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e910 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1e920 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
1e930 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
1e940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
1e960 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
1e970 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1e980 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
1e990 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
1e9a0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
1e9b0 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
1e9c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e9d0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
1e9e0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
1e9f0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  k */.        int
1ea00 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
1ea10 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
1ea20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
1ea30 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
1ea40 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
1ea50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ea60 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
1ea70 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1ea80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1ea90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1eaa0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1eab0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1eac0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
1ead0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1eae0 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20   i, dist;.      
1eaf0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
1eb00 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
1eb10 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1eb20 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
1eb30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
1eb40 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
1eb50 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
1eb60 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
1eb70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1eb80 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
1eb90 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
1eba0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
1ebb0 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
1ebc0 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
1ebd0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
1ebe0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1ebf0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
1ec00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
1ec10 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
1ec20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ec30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1ec40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
1ec50 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
1ec60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
1ec70 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1ec80 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1ec90 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
1eca0 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69  !searchList || i
1ecb0 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a  Page==nearby ){.
1ecc0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
1ecd0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
1ece0 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 73      if( *pPgno>s
1ecf0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1ed00 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1ed10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1ed20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66   /* Free page of
1ed30 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
1ed40 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
1ed50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ed60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ed70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ed80 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1ed90 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
1eda0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
1edb0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
1edd0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
1ede0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1edf0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
1ee00 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
1ee10 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
1ee20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ee30 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
1ee40 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1ee50 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
1ee60 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
1ee70 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
1ee80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ee90 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
1eea0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1eeb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eec0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1eed0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1eee0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
1eef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ef00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1ef10 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1ef20 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61  tRollback((*ppPa
1ef30 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1ef40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1ef50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ef60 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
1ef70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1ef80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ef90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1efa0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1efb0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1efc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1efd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1efe0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1eff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f000 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
1f010 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1f020 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
1f030 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
1f040 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
1f050 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f060 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
1f070 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1f080 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
1f090 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
1f0a0 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
1f0b0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 2a  he file */.    *
1f0c0 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 50  pPgno = sqlite3P
1f0d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1f0e0 74 2d 3e 70 50 61 67 65 72 29 20 2b 20 31 3b 0a  t->pPager) + 1;.
1f0f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f100 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f110 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
1f120 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  unc ){.      /* 
1f130 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68  An incr-vacuum h
1f140 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77  as already run w
1f150 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
1f160 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20  action. So the. 
1f170 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20       ** page to 
1f180 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20  allocate is not 
1f190 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61  from the physica
1f1a0 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  l end of the fil
1f1b0 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  e, but.      ** 
1f1c0 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20  at pBt->nTrunc. 
1f1d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f1e0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54  *pPgno = pBt->nT
1f1f0 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66  runc+1;.      if
1f200 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  ( *pPgno==PENDIN
1f210 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f220 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50   ){.        (*pP
1f230 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  gno)++;.      }.
1f240 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1f250 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
1f260 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1f270 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
1f280 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
1f290 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
1f2a0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
1f2b0 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
1f2c0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1f2d0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1f2e0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
1f2f0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
1f300 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
1f310 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
1f320 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
1f330 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
1f340 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
1f350 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
1f360 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28   */.      TRACE(
1f370 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
1f380 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
1f390 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
1f3a0 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
1f3b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
1f3c0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
1f3d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
1f3e0 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
1f3f0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  +;.      if( *pP
1f400 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
1f410 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28  E_PAGE(pBt) ){ (
1f420 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20  *pPgno)++; }.   
1f430 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1f440 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
1f450 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70  pBt->nTrunc = *p
1f460 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Pgno;.    }.#end
1f470 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
1f480 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1f490 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f4a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f4b0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1f4c0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1f4d0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1f4e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1f4f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f500 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
1f510 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
1f520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f540 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
1f550 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
1f560 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1f570 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
1f580 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
1f590 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1f5a0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1f5b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f5c0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
1f5d0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
1f5e0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
1f5f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
1f600 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  evTrunk);.  retu
1f610 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f620 41 64 64 20 61 20 70 61 67 65 20 6f 66 20 74 68  Add a page of th
1f630 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f640 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1f650 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  .**.** sqlite3Pa
1f660 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f  gerUnref() is NO
1f670 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61  T called for pPa
1f680 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1f690 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  t freePage(MemPa
1f6a0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74  ge *pPage){.  Bt
1f6b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1f6c0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  age->pBt;.  MemP
1f6d0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1f6e0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  t->pPage1;.  int
1f6f0 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a   rc, n, k;..  /*
1f700 20 50 72 65 70 61 72 65 20 74 68 65 20 70 61 67   Prepare the pag
1f710 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f  e for freeing */
1f720 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f730 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1f740 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1f750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f760 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20  age->pgno>1 );. 
1f770 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1f780 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
1f790 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  e(pPage->pParent
1f7a0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72  );.  pPage->pPar
1f7b0 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ent = 0;..  /* I
1f7c0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
1f7d0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
1f7e0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
1f7f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f800 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
1f810 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1f820 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d  return rc;.  n =
1f830 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1f840 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1f850 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1f860 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b  1->aData[36], n+
1f870 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
1f880 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1f890 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
1f8a0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1f8b0 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
1f8c0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
1f8d0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
1f8e0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
1f8f0 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
1f900 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
1f910 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
1f920 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f930 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1f940 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1f950 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  urn rc;.  memset
1f960 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
1f970 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
1f980 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
1f990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f9a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f9b0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1f9c0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
1f9d0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
1f9e0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
1f9f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
1fa00 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
1fa10 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
1fa20 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
1fa30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1fa40 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  ){.    rc = ptrm
1fa50 61 70 50 75 74 28 70 42 74 2c 20 70 50 61 67 65  apPut(pBt, pPage
1fa60 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46  ->pgno, PTRMAP_F
1fa70 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  REEPAGE, 0);.   
1fa80 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1fa90 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1faa0 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
1fab0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1fac0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1fad0 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
1fae0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1faf0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
1fb00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1fb10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d  turn rc;.    mem
1fb20 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
1fb30 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74  , 0, 8);.    put
1fb40 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1fb50 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
1fb60 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43  >pgno);.    TRAC
1fb70 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
1fb80 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67  d first\n", pPag
1fb90 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
1fba0 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
1fbb0 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65   free pages alre
1fbc0 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72  ady exist.  Retr
1fbd0 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72  ive the first tr
1fbe0 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  unk page.    ** 
1fbf0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1fc00 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77  and find out how
1fc10 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20   many leaves it 
1fc20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  has. */.    MemP
1fc30 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20  age *pTrunk;.   
1fc40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1fc50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67  eeGetPage(pBt, g
1fc60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1fc70 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54  >aData[32]), &pT
1fc80 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
1fc90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1fca0 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79  ;.    k = get4by
1fcb0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1fcc0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b  a[4]);.    if( k
1fcd0 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  >=pBt->usableSiz
1fce0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
1fcf0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73   /* The trunk is
1fd00 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65   full.  Turn the
1fd10 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
1fd20 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20  d into a new.   
1fd30 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65     ** trunk page
1fd40 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e   with no leaves.
1fd50 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1fd60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fd70 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1fd80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1fd90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fda0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
1fdb0 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75  age->aData, pTru
1fdc0 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nk->pgno);.     
1fdd0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1fde0 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
1fdf0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1fe00 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1fe10 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67  a[32], pPage->pg
1fe20 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  no);.        TRA
1fe30 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
1fe40 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
1fe50 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
1fe60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fe70 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
1fe80 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
1fe90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1fea0 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20  e if( k<0 ){.   
1feb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1fec0 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
1fed0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20  e{.      /* Add 
1fee0 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20  the newly freed 
1fef0 70 61 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f  page as a leaf o
1ff00 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
1ff10 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  unk */.      rc 
1ff20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1ff30 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1ff40 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
1ff50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ff60 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1ff70 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1ff80 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20  [4], k+1);.     
1ff90 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
1ffa0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34  unk->aData[8+k*4
1ffb0 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1ffc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ffd0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1ffe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1fff0 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
20000 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e  e->pDbPage);.#en
20010 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
20020 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
20030 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
20040 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
20050 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
20060 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
20070 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
20080 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
20090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
200a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
200b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
200c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
200d0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
200e0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
200f0 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
20100 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
20110 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
20120 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20130 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
20140 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
20150 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
20160 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
20170 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
20180 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
20190 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
201a0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
201b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
201c0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
201d0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
201e0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
201f0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
20200 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
20210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
20220 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
20230 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
20240 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
20250 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
20260 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
20270 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
20280 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50  rflow]);.  ovflP
20290 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
202a0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
202b0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
202c0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
202d0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
202e0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
202f0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
20300 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
20310 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
20320 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
20330 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
20340 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c  fl;.    if( ovfl
20350 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50  Pgno==0 || ovflP
20360 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72  gno>sqlite3Pager
20370 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
20380 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
20390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
203a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
203b0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f  }..    rc = getO
203c0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
203d0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
203e0 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a  l, (nOvfl==0)?0:
203f0 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20  &ovflPgno);.    
20400 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20410 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65  rc;.    rc = fre
20420 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
20430 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
20440 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
20450 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
20460 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
20470 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20480 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
20490 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
204a0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
204b0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
204c0 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
204d0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
204e0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
204f0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
20500 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
20510 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
20520 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
20530 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
20540 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
20550 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
20560 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
20570 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
20580 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
20590 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
205a0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
205b0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
205c0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
205d0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
205e0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
205f0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
20600 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
20610 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
20620 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
20630 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
20640 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
20650 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
20660 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
20670 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
20680 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
20690 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
206a0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
206b0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
206c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
206d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
206e0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
206f0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
20700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
20710 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
20720 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
20730 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
20740 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
20750 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
20760 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
20770 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
20780 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
20790 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
207a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
207b0 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
207c0 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
207d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
207e0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
207f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
20800 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
20810 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
20820 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
20830 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
20840 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
20850 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
20860 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
20870 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
20880 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
20890 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
208a0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
208b0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
208c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
208d0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
208e0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
208f0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
20900 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
20910 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20920 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20930 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
20940 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
20950 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
20960 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
20970 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
20980 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
20990 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
209a0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
209b0 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
209c0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
209d0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
209e0 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d  Data+nZero);.  }
209f0 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
20a00 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  = nZero = 0;.  }
20a10 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
20a20 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
20a30 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
20a40 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  &nKey);.  sqlite
20a50 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
20a60 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
20a70 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
20a80 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
20a90 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
20aa0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
20ab0 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
20ac0 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e  t( info.nData==n
20ad0 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20  Data+nZero );.  
20ae0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
20af0 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e  e payload */.  n
20b00 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
20b10 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
20b20 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
20b30 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
20b40 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
20b50 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
20b60 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
20b70 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  nPayload += nKey
20b80 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
20b90 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b  y;.    nSrc = nK
20ba0 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
20bb0 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
20bc0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
20bd0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
20be0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
20bf0 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
20c00 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
20c10 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
20c20 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
20c30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
20c40 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eLeft==0 ){.    
20c50 20 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20    int isExact = 
20c60 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
20c70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
20c80 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
20c90 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
20ca0 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
20cb0 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
20cc0 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
20cd0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
20ce0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
20cf0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
20d00 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
20d10 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
20d20 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
20d30 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
20d40 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
20d50 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
20d60 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
20d70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
20d80 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b  f( pgnoOvfl>1 ){
20d90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73  .          /* is
20da0 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20  Exact = 1; */.  
20db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20dc0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
20dd0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
20de0 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
20df0 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
20e00 4f 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a  Ovfl, isExact);.
20e10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20e20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
20e30 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
20e40 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
20e50 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
20e60 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
20e70 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
20e80 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
20e90 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
20ea0 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
20eb0 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
20ec0 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
20ed0 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
20ee0 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
20ef0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
20f00 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
20f10 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
20f20 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
20f30 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
20f40 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
20f50 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
20f60 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
20f70 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
20f80 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
20f90 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
20fa0 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
20fb0 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
20fc0 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
20fd0 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
20fe0 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65  the uninitialise
20ff0 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
21000 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
21010 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
21020 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
21030 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21040 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
21050 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
21060 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
21070 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
21080 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
21090 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
210a0 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
210b0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
210c0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
210d0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
210e0 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
210f0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
21100 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
21110 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
21120 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
21130 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
21140 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21150 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
21160 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
21180 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
21190 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
211a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
211b0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
211c0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
211d0 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
211e0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
211f0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
21200 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
21210 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
21220 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
21230 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
21240 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
21250 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
21260 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
21270 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
21280 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
21290 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  t;.    if( nSrc>
212a0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
212b0 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
212c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
212d0 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
212e0 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
212f0 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
21300 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
21310 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
21320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
21330 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
21340 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
21350 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
21360 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
21370 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
21380 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
21390 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
213a0 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
213b0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
213c0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
213d0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
213e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
213f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
21400 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  nge the MemPage.
21410 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
21420 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73  on the page whos
21430 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67  e number is.** g
21440 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
21450 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74  nd argument so t
21460 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  hat MemPage.pPar
21470 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  ent holds the.**
21480 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
21490 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a  third argument..
214a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
214b0 70 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61  parentPage(BtSha
214c0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
214d0 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e  gno, MemPage *pN
214e0 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64  ewParent, int id
214f0 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  x){.  MemPage *p
21500 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a  This;.  DbPage *
21510 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
21520 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21530 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
21540 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
21550 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b  pNewParent!=0 );
21560 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
21570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21580 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  K;.  assert( pBt
21590 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
215a0 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
215b0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
215c0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
215d0 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
215e0 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28  ){.    pThis = (
215f0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
21600 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
21610 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
21620 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29   pThis->isInit )
21630 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21640 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71  pThis->aData==sq
21650 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
21660 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  a(pDbPage) );.  
21670 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70      if( pThis->p
21680 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65  Parent!=pNewPare
21690 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
216a0 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74  ( pThis->pParent
216b0 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55   ) sqlite3PagerU
216c0 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72  nref(pThis->pPar
216d0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
216e0 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50         pThis->pP
216f0 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65  arent = pNewPare
21700 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  nt;.        sqli
21710 74 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77  te3PagerRef(pNew
21720 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
21730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21740 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74  pThis->idxParent
21750 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20   = idx;.    }.  
21760 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
21770 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
21780 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
21790 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
217a0 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
217b0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
217c0 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28  eturn ptrmapPut(
217d0 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  pBt, pgno, PTRMA
217e0 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72  P_BTREE, pNewPar
217f0 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ent->pgno);.  }.
21800 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
21810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
21820 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21830 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72   pParent pointer
21840 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
21850 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69   of pPage to poi
21860 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50  nt back.** to pP
21870 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  age..**.** In ot
21880 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65  her words, for e
21890 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50  very child of pP
218a0 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61  age, invoke repa
218b0 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f  rentPage().** to
218c0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
218d0 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73  each child knows
218e0 20 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69   that pPage is i
218f0 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  ts parent..**.**
21900 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
21910 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  ts called after 
21920 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65  you memcpy() one
21930 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e   page into.** an
21940 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  other..*/.static
21950 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69   int reparentChi
21960 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ldPages(MemPage 
21970 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
21980 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
21990 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
219a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
219b0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
219c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
219d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
219e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
219f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65  pPage->leaf ) re
21a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21a10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
21a20 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
21a30 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
21a40 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
21a50 2c 20 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  , i);.    rc = r
21a60 65 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c  eparentPage(pBt,
21a70 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
21a80 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  , pPage, i);.   
21a90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21aa0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
21ab0 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72    }.  rc = repar
21ac0 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
21ad0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
21ae0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
21af0 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20  fset+8]), .     
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21b10 50 61 67 65 2c 20 69 29 3b 0a 20 20 70 50 61 67  Page, i);.  pPag
21b20 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
21b30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21b40 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
21b50 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
21b60 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
21b70 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
21b80 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
21b90 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
21ba0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
21bb0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
21bc0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
21bd0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
21be0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
21bf0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
21c00 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
21c10 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
21c20 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
21c30 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
21c40 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
21c50 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
21c60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
21c70 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
21c80 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
21c90 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
21ca0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
21cb0 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
21cc0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21cd0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
21ce0 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
21cf0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
21d00 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
21d10 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
21d20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
21d30 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
21d40 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
21d50 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
21d60 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
21d70 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
21d80 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
21d90 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
21da0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
21db0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
21dc0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
21dd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
21de0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
21df0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
21e00 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
21e10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21e20 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
21e30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
21e40 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
21e50 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
21e60 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
21e70 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
21e80 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
21e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 31  ;.  assert( pc>1
21ea0 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67  0 && pc+sz<=pPag
21eb0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
21ec0 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63  ze );.  freeSpac
21ed0 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
21ee0 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  ;.  for(i=idx+1;
21ef0 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
21f00 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
21f10 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
21f20 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
21f30 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
21f40 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
21f50 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
21f60 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
21f70 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
21f80 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
21f90 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65  ee += 2;.  pPage
21fa0 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a  ->idxShift = 1;.
21fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
21fc0 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
21fd0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
21fe0 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
21ff0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
22000 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
22010 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
22020 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
22030 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
22040 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
22050 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
22060 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
22070 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
22080 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
22090 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
220a0 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
220b0 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
220c0 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
220d0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
220e0 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
220f0 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  aOvfl[] and make
22100 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
22110 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
22120 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
22130 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
22140 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
22150 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
22160 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
22170 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
22180 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
22190 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
221a0 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
221b0 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
221c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
221d0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
221e0 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
221f0 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
22200 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
22210 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
22220 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
22230 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
22240 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
22250 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
22260 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
22270 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
22280 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
22290 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
222a0 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
222b0 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
222c0 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
222d0 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c  ic int insertCel
222e0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
222f0 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
22300 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
22310 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
22320 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
22330 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
22340 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
22350 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
22360 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
22370 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
22380 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
22390 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
223a0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
223b0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
223c0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
223d0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
223e0 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
223f0 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
22400 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53  eeded */.  u8 nS
22410 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20  kip          /* 
22420 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  Do not write the
22430 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
22440 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  es of the cell *
22450 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20  /.){.  int idx; 
22460 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
22470 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
22480 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
22490 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
224a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
224b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
224c0 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
224d0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
224e0 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72  e of content for
224f0 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74   any cell in dat
22500 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  a[] */.  int end
22510 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
22520 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
22530 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
22540 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
22550 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
22560 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
22570 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
22580 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
22590 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
225a0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
225b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
225c0 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70   data[] of the p
225d0 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
225e0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
225f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
22600 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
22610 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
22620 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
22630 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
22640 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
22650 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
22660 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
22670 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
22680 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
22690 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
226a0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
226b0 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
226c0 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
226d0 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
226e0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
226f0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
22700 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22710 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
22720 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
22730 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
22740 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
22750 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
22760 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
22770 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
22780 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
22790 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
227a0 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
227b0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
227c0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
227d0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
227e0 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f   assert( j<sizeo
227f0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
22800 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
22810 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70  vfl[0]) );.    p
22820 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
22830 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
22840 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
22850 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70  ].idx = i;.    p
22860 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  Page->nFree = 0;
22870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
22880 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
22890 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
228a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
228b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
228c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
228d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
228e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
228f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
22900 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
22910 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
22920 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64  e->aData;.    hd
22930 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
22940 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20  fset;.    top = 
22950 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
22960 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+5]);.    cell
22970 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
22980 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
22990 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
229a0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
229b0 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d  l + 2;.    ins =
229c0 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
229d0 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e  i;.    if( end >
229e0 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20   top - sz ){.   
229f0 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
22a00 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
22a10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22a20 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
22a30 72 63 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20  rc;.      top = 
22a40 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
22a50 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
22a60 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
22a70 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
22a80 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
22a90 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
22aa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
22ab0 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
22ac0 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
22ad0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
22ae0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
22af0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
22b00 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
22b10 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
22b20 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
22b30 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
22b40 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
22b50 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
22b60 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
22b70 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
22b80 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
22b90 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
22ba0 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
22bb0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
22bc0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
22bd0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
22be0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
22bf0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
22c00 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
22c10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22c20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
22c30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
22c40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
22c50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
22c60 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
22c70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
22c80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
22c90 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
22ca0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
22cb0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
22cc0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
22cd0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
22ce0 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49    */.      CellI
22cf0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
22d00 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
22d10 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
22d20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
22d30 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e       assert( (in
22d40 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
22d50 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
22d60 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
22d70 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66  load );.      if
22d80 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
22d90 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
22da0 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e  nfo.nKey))>info.
22db0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
22dc0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
22dd0 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
22de0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
22df0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
22e00 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
22e10 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  ->pBt, pgnoOvfl,
22e20 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
22e30 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
22e40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
22e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
22e60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
22e70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
22e80 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
22e90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
22ea0 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
22eb0 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
22ec0 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
22ed0 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
22ee0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
22ef0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
22f00 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
22f10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
22f20 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
22f30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
22f40 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
22f50 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
22f60 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
22f70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
22f80 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
22f90 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
22fa0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
22fb0 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
22fc0 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
22fd0 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
22fe0 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
22ff0 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
23000 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
23010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23020 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
23030 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20   int totalSize; 
23040 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
23050 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
23060 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
23070 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
23080 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
23090 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20    int cellptr;  
230a0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
230b0 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
230c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
230d0 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
230e0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
230f0 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
23100 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
23110 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70  * Data for the p
23120 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
23130 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
23140 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
23150 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23160 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
23170 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f  ->mutex) );.  to
23180 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66  talSize = 0;.  f
23190 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
231a0 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c   i++){.    total
231b0 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  Size += aSize[i]
231c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
231d0 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c  totalSize+2*nCel
231e0 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  l<=pPage->nFree 
231f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
23200 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
23210 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67    cellptr = pPag
23220 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
23230 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
23240 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
23250 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
23260 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
23270 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
23280 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a  .  if( nCell ){.
23290 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61      cellbody = a
232a0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
232b0 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  ge, totalSize);.
232c0 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
232d0 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73  body>0 );.    as
232e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
232f0 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b  ee >= 2*nCell );
23300 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
23310 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  e -= 2*nCell;.  
23320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
23330 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
23340 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  put2byte(&data[c
23350 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64  ellptr], cellbod
23360 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  y);.      memcpy
23370 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
23380 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
23390 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65  ze[i]);.      ce
233a0 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
233b0 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53    cellbody += aS
233c0 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
233d0 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
233e0 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  dy==pPage->pBt->
233f0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
23400 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
23410 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a   = nCell;.}../*.
23420 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23430 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
23440 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
23450 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
23460 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
23470 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
23480 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
23490 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
234a0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
234b0 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
234c0 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
234d0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
234e0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
234f0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
23500 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
23510 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
23520 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
23530 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
23540 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
23550 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
23560 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
23570 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
23580 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
23590 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
235a0 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
235b0 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
235c0 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
235d0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
235e0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
235f0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
23600 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
23610 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
23620 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
23630 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
23640 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
23650 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
23660 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
23670 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
23680 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
23690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
236a0 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
236b0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
236c0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
236d0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
236e0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
236f0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
23700 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
23710 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
23720 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
23730 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
23740 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66  age*, int);..#if
23750 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23760 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
23770 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
23780 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
23790 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
237a0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
237b0 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
237c0 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
237d0 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
237e0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
237f0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
23800 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
23810 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
23820 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
23830 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
23840 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
23850 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
23860 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
23870 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
23880 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
23890 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
238a0 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
238b0 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
238c0 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
238d0 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
238e0 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
238f0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
23900 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
23910 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
23920 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
23930 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
23940 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
23950 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
23960 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
23970 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
23980 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
23990 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
239a0 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
239b0 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
239c0 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
239d0 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
239e0 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
239f0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
23a00 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
23a10 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
23a20 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
23a30 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
23a40 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
23a50 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
23a60 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
23a70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
23a80 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
23a90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d  emPage *pPage, M
23aa0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29  emPage *pParent)
23ab0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
23ac0 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50  mPage *pNew;.  P
23ad0 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75  gno pgnoNew;.  u
23ae0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20  8 *pCell;.  u16 
23af0 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e  szCell;.  CellIn
23b00 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61  fo info;.  BtSha
23b10 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
23b20 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72  ->pBt;.  int par
23b30 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74  entIdx = pParent
23b40 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50  ->nCell;   /* pP
23b50 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65  arent new divide
23b60 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  r cell index */.
23b70 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65    int parentSize
23b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23b90 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
23ba0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
23bb0 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65  */.  u8 parentCe
23bc0 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20  ll[64];         
23bd0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
23be0 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69  for the new divi
23bf0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61  der cell */..  a
23c00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
23c10 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
23c20 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
23c30 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
23c40 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72   new page. Inser
23c50 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  t the overflow c
23c60 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20  ell from pPage. 
23c70 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65   ** into it. The
23c80 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65  n remove the ove
23c90 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
23ca0 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  pPage..  */.  rc
23cb0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
23cc0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
23cd0 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
23ce0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
23cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
23d00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
23d10 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
23d20 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73  fl[0].pCell;.  s
23d30 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
23d40 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
23d50 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  );.  zeroPage(pN
23d60 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
23d70 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65  [0]);.  assemble
23d80 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
23d90 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
23da0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
23db0 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  ow = 0;..  /* Se
23dc0 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  t the parent of 
23dd0 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
23de0 74 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72  ted page to pPar
23df0 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  ent. */.  pNew->
23e00 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
23e10 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
23e20 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
23e30 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50  bPage);..  /* pP
23e40 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
23e50 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
23e60 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
23e70 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f  nge this.  ** so
23e80 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
23e90 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77  child is the new
23ea0 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   page allocated 
23eb0 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70  above and.  ** p
23ec0 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74  Page is the next
23ed0 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e  -to-right child.
23ee0 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
23ef0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
23f00 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  );.  pCell = fin
23f10 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
23f20 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
23f30 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
23f40 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
23f50 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
23f60 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
23f70 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
23f80 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
23f90 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61  ey, 0, 0, 0, &pa
23fa0 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28  rentSize);.  if(
23fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23fc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
23fd0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
23fe0 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a  arentSize<64 );.
23ff0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
24000 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  l(pParent, paren
24010 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c  tIdx, parentCell
24020 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c  , parentSize, 0,
24030 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   4);.  if( rc!=S
24040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24060 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
24070 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
24080 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70  nt,parentIdx), p
24090 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70  Page->pgno);.  p
240a0 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
240b0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
240c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
240d0 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65  gnoNew);..#ifnde
240e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
240f0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66  TOVACUUM.  /* If
24100 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
24110 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
24120 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
24130 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69  nter map.  ** wi
24140 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
24150 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
24160 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
24170 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c  m the .  ** cell
24180 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
24190 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
241a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
241b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
241c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
241d0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
241e0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
241f0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
24200 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
24220 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
24230 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d  (pNew, 0);.    }
24240 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24260 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
24270 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24280 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  rc;.    }.  }.#e
24290 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ndif..  /* Relea
242a0 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
242b0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
242c0 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65   and balance the
242d0 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20   parent page,.  
242e0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64  ** in case the d
242f0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65  ivider cell inse
24300 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74  rted caused it t
24310 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
24320 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  l..  */.  releas
24330 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72  ePage(pNew);.  r
24340 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50  eturn balance(pP
24350 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e  arent, 0);.}.#en
24360 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
24370 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
24380 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
24390 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
243a0 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50  utes Cells on pP
243b0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e  age and up to NN
243c0 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f  *2 siblings.** o
243d0 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20  f pPage so that 
243e0 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
243f0 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d  bout the same am
24400 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
24410 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e  ce..** Usually N
24420 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
24430 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
24440 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68  ge is used in th
24450 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20  e balancing,.** 
24460 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c  though more sibl
24470 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
24480 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66  from one side if
24490 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69   pPage is the fi
244a0 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63  rst.** or last c
244b0 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
244c0 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61  nt.  If pPage ha
244d0 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e  s fewer than 2*N
244e0 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73  N siblings.** (s
244f0 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
24500 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
24510 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72  f pPage is the r
24520 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a  oot page or a .*
24530 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29  * child of root)
24540 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
24550 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72  ble siblings par
24560 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
24570 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a  balancing..**.**
24580 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
24590 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65  iblings of pPage
245a0 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
245b0 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
245c0 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77   by one or.** tw
245d0 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
245e0 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
245f0 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
24600 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20   over full. The 
24610 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20  root page.** is 
24620 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61  special and is a
24630 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61  llowed to be nea
24640 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50  rly empty. If pP
24650 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72  age is .** the r
24660 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
24670 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
24680 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e  tree might be in
24690 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65  creased.** or de
246a0 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20  creased by one, 
246b0 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f  as necessary, to
246c0 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70   keep the root p
246d0 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a  age from being.*
246e0 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f  * overfull or co
246f0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
24700 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
24710 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
24720 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
24730 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f  e of the Cells o
24740 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  n pPage.** might
24750 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
24760 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
24770 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73  ->aData[].  This
24780 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
24790 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
247a0 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66  erfull.  Part of
247b0 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   the job of this
247c0 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a   routine is to.*
247d0 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * make sure all 
247e0 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20  Cells for pPage 
247f0 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69  once again fit i
24800 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
24810 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
24820 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
24830 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ng the siblings 
24840 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61  of pPage, the pa
24850 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a  rent of pPage.**
24860 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76   might become ov
24870 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
24880 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61  ull.  If that ha
24890 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73  ppens, then this
248a0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
248b0 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
248c0 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e  y on the parent.
248d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  .**.** If this r
248e0 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72  outine fails for
248f0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20   any reason, it 
24900 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20  might leave the 
24910 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61  database.** in a
24920 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65   corrupted state
24930 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  .  So if this ro
24940 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
24950 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
24960 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
24970 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
24980 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  t balance_nonroo
24990 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  t(MemPage *pPage
249a0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
249b0 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  arent;          
249c0 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
249d0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74  of pPage */.  Bt
249e0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
249f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24a00 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
24a10 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
24a20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24a30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24a40 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
24a50 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
24a60 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
24a70 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
24a80 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
24a90 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
24aa0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ac0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
24ad0 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
24ae0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  */.  int nNew;  
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
24b10 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
24b20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20  */.  int nDiv;  
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
24b50 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20  ells in apDiv[] 
24b60 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
24b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24b80 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
24b90 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b  rs */.  int idx;
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bb0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
24bc0 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e   pPage in pParen
24bd0 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
24be0 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20  int nxDiv;      
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c00 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f  Next divider slo
24c10 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  t in pParent->aC
24c20 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ell[] */.  int r
24c30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24c40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
24c50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
24c60 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69  int leafCorrecti
24c70 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
24c80 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
24c90 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20  leaf.  0 if not 
24ca0 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74  */.  int leafDat
24cb0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
24cc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
24cd0 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20  ge is a leaf of 
24ce0 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
24cf0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
24d00 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
24d10 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50    /* Bytes in pP
24d20 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68  age beyond the h
24d30 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  eader */.  int p
24d40 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ageFlags;       
24d50 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
24d60 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
24d70 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  [0] */.  int sub
24d80 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20  total;          
24d90 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61        /* Subtota
24da0 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65  l of bytes in ce
24db0 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20  lls on one page 
24dc0 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 20  */.  int iSpace 
24dd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24de0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
24df0 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
24e00 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
24e10 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
24e20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
24e30 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
24e40 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ings */.  Pgno p
24e50 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  gnoOld[NB];     
24e60 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
24e70 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
24e80 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  page in apOld[] 
24e90 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
24ea0 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
24eb0 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
24ec0 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
24ed0 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
24ee0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
24ef0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
24f00 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
24f10 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
24f20 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  ncing */.  Pgno 
24f30 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  pgnoNew[NB+2];  
24f40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
24f50 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
24f60 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d   page in apNew[]
24f70 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
24f80 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
24f90 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
24fa0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
24fb0 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
24fc0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
24fd0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
24fe0 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
24ff0 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
25000 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
25010 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
25020 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
25030 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
25040 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
25050 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
25060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25070 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
25080 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
25090 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
250a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
250b0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
250c0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
250d0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70  [] */.  u8 *aCop
250e0 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  y[NB];          
250f0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
25100 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f  r holding data o
25110 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20  f apCopy[] */.  
25120 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20 20  u8 *aSpace;     
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25140 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63 6f  Space to hold co
25150 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
25160 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64 65   cells */.#ifnde
25170 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25180 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a 61  TOVACUUM.  u8 *a
25190 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  From = 0;.#endif
251a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
251b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
251c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
251d0 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  ) );..  /* .  **
251e0 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   Find the parent
251f0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
25200 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
25210 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
25220 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25230 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
25240 70 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67  pDbPage) || pPag
25250 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
25260 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
25270 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74  ->pBt;.  pParent
25280 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
25290 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
252a0 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53 51  rent );.  if( SQ
252b0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
252c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
252d0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
252e0 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e)) ){.    retur
252f0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 54 52 41 43  n rc;.  }.  TRAC
25300 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
25310 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
25320 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
25330 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
25340 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  >pgno));..#ifnde
25350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
25360 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a  ICKBALANCE.  /*.
25370 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63    ** A special c
25380 61 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65  ase:  If a new e
25390 6e 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65  ntry has just be
253a0 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
253b0 20 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74   a.  ** table (t
253c0 68 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20  hat is, a btree 
253d0 77 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79  with integer key
253e0 73 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61  s and all data a
253f0 74 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20  t the leaves).  
25400 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65  ** and the new e
25410 6e 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68  ntry is the righ
25420 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20  t-most entry in 
25430 74 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73  the tree (it has
25440 20 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73   the.  ** larges
25450 74 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20  t key) then use 
25460 74 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61  the special bala
25470 6e 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74  nce_quick() rout
25480 69 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c  ine for.  ** bal
25490 61 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65  ancing.  balance
254a0 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68  _quick() is much
254b0 20 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75   faster and resu
254c0 6c 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72  lts in a tighter
254d0 0a 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66  .  ** packing of
254e0 20 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d   data in the com
254f0 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  mon case..  */. 
25500 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
25510 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
25520 3e 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20  >intKey &&.     
25530 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
25540 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
25550 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26  >nOverflow==1 &&
25560 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  .      pPage->aO
25570 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
25580 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20  e->nCell &&.    
25590 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74    pPage->pParent
255a0 2d 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20  ->pgno!=1 &&.   
255b0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
255c0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
255d0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
255e0 5d 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a  ])==pPage->pgno.
255f0 20 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20    ){.    /*.    
25600 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74  ** TODO: Check t
25610 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 74  he siblings to t
25620 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67 65  he left of pPage
25630 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61 74  . It may be that
25640 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65  .    ** they are
25650 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e 6f   not full and no
25660 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65 71   new page is req
25670 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
25680 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
25690 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70 50  _quick(pPage, pP
256a0 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  arent);.  }.#end
256b0 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  if..  if( SQLITE
256c0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
256d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
256e0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  ge->pDbPage)) ){
256f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
25700 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
25710 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e 20  ind the cell in 
25720 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
25730 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c 64  whose left child
25740 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a   points back.  *
25750 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68 65  * to pPage.  The
25760 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65 20   "idx" variable 
25770 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
25780 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20 70  that cell.  If p
25790 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68 65  Page.  ** is the
257a0 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c 64   rightmost child
257b0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65 6e   of pParent then
257c0 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61 72   set idx to pPar
257d0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f  ent->nCell .  */
257e0 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
257f0 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20 20  idxShift ){.    
25800 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 70  Pgno pgno;.    p
25810 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
25820 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
25830 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
25840 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
25850 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
25860 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64     for(idx=0; id
25870 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  x<pParent->nCell
25880 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20  ; idx++){.      
25890 69 66 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  if( get4byte(fin
258a0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
258b0 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20  dx))==pgno ){.  
258c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
258d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
258e0 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 72 65  ssert( idx<pPare
258f0 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  nt->nCell.      
25900 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62 79         || get4by
25910 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
25920 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
25930 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20  ffset+8])==pgno 
25940 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25950 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64 78  idx = pPage->idx
25960 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f  Parent;.  }..  /
25970 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  *.  ** Initializ
25980 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20 74  e variables so t
25990 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 73  hat it will be s
259a0 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a  afe to jump.  **
259b0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61 6c   directly to bal
259c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74 20  ance_cleanup at 
259d0 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f  any moment..  */
259e0 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d  .  nOld = nNew =
259f0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   0;.  sqlite3Pag
25a00 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70  erRef(pParent->p
25a10 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20  DbPage);..  /*. 
25a20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67   ** Find sibling
25a30 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65 20   pages to pPage 
25a40 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  and the cells in
25a50 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64 69   pParent that di
25a60 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69  vide.  ** the si
25a70 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65  blings.  An atte
25a80 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
25a90 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
25aa0 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73  on either.  ** s
25ab0 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d  ide of pPage.  M
25ac0 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
25ad0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
25ae0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69  side, however, i
25af0 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65  f.  ** pPage the
25b00 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
25b10 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
25b20 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
25b30 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a    If pParent.  *
25b40 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
25b50 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
25b60 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
25b70 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
25b80 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20  n..  */.  nxDiv 
25b90 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66  = idx - NN;.  if
25ba0 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70  ( nxDiv + NB > p
25bb0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
25bc0 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61  .    nxDiv = pPa
25bd0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42  rent->nCell - NB
25be0 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   + 1;.  }.  if( 
25bf0 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e  nxDiv<0 ){.    n
25c00 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDiv = 0;.  }.  
25c10 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nDiv = 0;.  for(
25c20 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c  i=0, k=nxDiv; i<
25c30 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20  NB; i++, k++){. 
25c40 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74     if( k<pParent
25c50 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
25c60 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
25c70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29  Cell(pParent, k)
25c80 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a  ;.      nDiv++;.
25c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
25ca0 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a  Parent->leaf );.
25cb0 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
25cc0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
25cd0 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v[i]);.    }else
25ce0 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d   if( k==pParent-
25cf0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
25d00 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
25d10 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
25d20 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
25d30 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
25d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
25d50 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
25d60 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
25d70 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64  age(pBt, pgnoOld
25d80 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20  [i], &apOld[i], 
25d90 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66  pParent);.    if
25da0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
25db0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
25dc0 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61   apOld[i]->idxPa
25dd0 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61 70  rent = k;.    ap
25de0 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Copy[i] = 0;.   
25df0 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64   assert( i==nOld
25e00 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a   );.    nOld++;.
25e10 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
25e20 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
25e30 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
25e40 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  erflow;.  }..  /
25e50 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
25e60 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
25e70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
25e80 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
25e90 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
25ea0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
25eb0 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
25ec0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
25ed0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
25ee0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
25ef0 0a 20 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  .  */.  apCell =
25f00 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
25f10 20 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c   .       nMaxCel
25f20 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
25f50 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
25f60 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
25f90 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e 44 38  /.     + (ROUND8
25fa0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
25fb0 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )+pBt->pageSize)
25fc0 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f  *NB  /* aCopy */
25fd0 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
25fe0 65 53 69 7a 65 2a 35 20 20 20 20 20 20 20 20 20  eSize*5         
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 20 20 20 20 2f 2a 20 61 53 70 61 63 65 20 2a 2f      /* aSpace */
26010 0a 20 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56  .     + (ISAUTOV
26020 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c  ACUUM ? nMaxCell
26030 73 20 3a 20 30 29 20 20 20 20 20 20 20 20 20 20  s : 0)          
26040 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a      /* aFrom */.
26050 20 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c    );.  if( apCel
26060 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
26070 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
26080 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
26090 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
260a0 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
260b0 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
260c0 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28  ;.  aCopy[0] = (
260d0 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
260e0 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
260f0 28 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28  ( ((aCopy[0] - (
26100 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
26110 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
26120 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
26130 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31  red */.  for(i=1
26140 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<NB; i++){.  
26150 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43    aCopy[i] = &aC
26160 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61  opy[i-1][pBt->pa
26170 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69  geSize+ROUND8(si
26180 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b  zeof(MemPage))];
26190 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61  .    assert( ((a
261a0 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61  Copy[i] - (u8*)a
261b0 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29  pCell) & 7)==0 )
261c0 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
261d0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
261e0 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 20 3d  /.  }.  aSpace =
261f0 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42   &aCopy[NB-1][pB
26200 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
26210 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
26220 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e))];.  assert( 
26230 28 28 61 53 70 61 63 65 20 2d 20 28 75 38 2a 29  ((aSpace - (u8*)
26240 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
26250 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
26260 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
26270 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
26280 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26290 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  M.  if( pBt->aut
262a0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 61  oVacuum ){.    a
262b0 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 5b 35  From = &aSpace[5
262c0 2a 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b  *pBt->pageSize];
262d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
262e0 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f   /*.  ** Make co
262f0 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74  pies of the cont
26300 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64  ent of pPage and
26310 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e   its siblings in
26320 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20  to aOld[]..  ** 
26330 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
26340 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
26350 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
26360 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
26370 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
26380 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
26390 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
263a0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
263b0 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  the.  ** process
263c0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
263d0 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  itten..  */.  fo
263e0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
263f0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
26400 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20   *p = apCopy[i] 
26410 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70  = (MemPage*)aCop
26420 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  y[i];.    memcpy
26430 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  (p, apOld[i], si
26440 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
26450 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28      p->aData = (
26460 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  void*)&p[1];.   
26470 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61   memcpy(p->aData
26480 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
26490 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
264a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
264b0 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
264c0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
264d0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
264e0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
264f0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
26500 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
26510 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
26520 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
26530 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
26540 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
26550 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 5b 5d  ed form aSpace[]
26560 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
26570 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
26580 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
26590 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
265a0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
265b0 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
265c0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
265d0 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
265e0 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
265f0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
26600 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
26610 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
26620 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
26630 20 61 53 70 61 63 65 5b 5d 2e 20 20 49 6e 20 74   aSpace[].  In t
26640 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
26650 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
26660 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
26670 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
26680 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
26690 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
266a0 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
266b0 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
266c0 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
266d0 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
266e0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
266f0 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
26700 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
26710 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
26720 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
26730 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
26740 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
26750 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
26760 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
26770 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
26780 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
26790 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
267a0 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
267b0 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
267c0 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
267d0 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
267e0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
267f0 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b   && pPage->leaf;
26800 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
26810 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
26820 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
26830 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
26840 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
26850 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
26860 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
26870 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
26880 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26890 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
268a0 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
268b0 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
268c0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
268d0 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
268e0 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
268f0 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
26900 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e  ll[nCell]);.#ifn
26910 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26920 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
26930 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
26940 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
26950 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61  int a;.        a
26960 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b  From[nCell] = i;
26970 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
26980 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
26990 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
269a0 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
269b0 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
269c0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
269d0 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
269e0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
269f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
26a00 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
26a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26a20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
26a30 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
26a40 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
26a50 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
26a60 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
26a70 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
26a80 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
26a90 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
26aa0 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
26ab0 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
26ac0 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
26ad0 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
26ae0 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
26af0 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
26b00 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
26b10 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
26b20 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
26b30 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
26b40 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
26b50 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
26b60 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
26b70 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
26b80 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
26b90 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
26ba0 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
26bb0 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
26bc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
26bd0 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
26be0 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
26bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26c00 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
26c10 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
26c20 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
26c30 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
26c40 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
26c50 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
26c60 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20 20 20  ce[iSpace];.    
26c70 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20 73 7a      iSpace += sz
26c80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26c90 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  ( iSpace<=pBt->p
26ca0 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20 20 20  ageSize*5 );.   
26cb0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
26cc0 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
26cd0 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
26ce0 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
26cf0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
26d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26d10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
26d20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
26d30 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26d40 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
26d50 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
26d60 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26d70 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
26d80 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
26d90 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  z);.        szCe
26da0 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61  ll[nCell] -= lea
26db0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
26dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
26dd0 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
26de0 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
26df0 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
26e00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
26e10 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
26e20 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
26e30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
26e40 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
26e50 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
26e60 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
26e70 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
26e80 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
26e90 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
26ea0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26eb0 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
26ec0 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
26ed0 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
26ee0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
26ef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
26f00 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
26f10 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
26f20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
26f30 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
26f40 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
26f50 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c  ot allow any cel
26f60 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ls smaller than 
26f70 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
26f80 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
26f90 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
26fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26fb0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
26fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26fd0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
26fe0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75  igure out the nu
26ff0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65  mber of pages ne
27000 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  eded to hold all
27010 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20   nCell cells..  
27020 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75  ** Store this nu
27030 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c  mber in "k".  Al
27040 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77  so compute szNew
27050 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
27060 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20  total.  ** size 
27070 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  of all cells on 
27080 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e  the i-th page an
27090 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68  d cntNew[] which
270a0 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   is the index.  
270b0 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f  ** in apCell[] o
270c0 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
270d0 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66  divides page i f
270e0 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a  rom page i+1.  .
270f0 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73    ** cntNew[k] s
27100 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c  hould equal nCel
27110 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c  l..  **.  ** Val
27120 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ues computed by 
27130 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a  this block:.  **
27140 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
27150 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  k: The total num
27160 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70  ber of sibling p
27170 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e  ages.  **    szN
27180 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73  ew[i]: Spaced us
27190 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73  ed on the i-th s
271a0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
271b0 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49  *   cntNew[i]: I
271c0 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ndex in apCell[]
271d0 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f   and szCell[] fo
271e0 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  r the first cell
271f0 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   to.  **        
27200 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20        the right 
27210 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  of the i-th sibl
27220 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75  ing page..  ** u
27230 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62  sableSpace: Numb
27240 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
27250 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  pace available o
27260 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a  n each sibling..
27270 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61    ** .  */.  usa
27280 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e  bleSpace = pBt->
27290 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20  usableSize - 12 
272a0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
272b0 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c  ;.  for(subtotal
272c0 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  =k=i=0; i<nCell;
272d0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
272e0 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( i<nMaxCells )
272f0 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b  ;.    subtotal +
27300 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b  = szCell[i] + 2;
27310 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61  .    if( subtota
27320 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20  l > usableSpace 
27330 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b  ){.      szNew[k
27340 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73  ] = subtotal - s
27350 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
27360 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20  cntNew[k] = i;. 
27370 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
27380 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  a ){ i--; }.    
27390 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a    subtotal = 0;.
273a0 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d        k++;.    }
273b0 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
273c0 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
273d0 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
273e0 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
273f0 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
27400 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
27410 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
27420 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
27430 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
27440 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
27450 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
27460 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
27470 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
27480 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
27490 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
274a0 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
274b0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
274c0 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
274d0 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
274e0 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
274f0 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
27500 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
27510 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
27520 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
27530 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
27540 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
27550 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
27560 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
27570 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
27580 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
27590 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
275a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
275b0 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
275c0 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
275d0 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
275e0 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
275f0 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
27600 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
27610 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
27620 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
27630 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
27640 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
27650 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
27660 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
27670 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
27680 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
27690 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
276a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
276b0 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
276c0 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
276d0 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
276e0 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
276f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
27700 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
27710 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
27720 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
27730 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
27740 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
27750 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
27760 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
27770 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
27780 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
27790 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
277a0 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
277b0 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
277c0 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
277d0 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
277e0 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
277f0 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
27800 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
27810 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
27820 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
27830 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
27840 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
27850 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
27860 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
27870 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
27880 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
27890 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
278a0 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
278b0 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
278c0 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
278d0 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65  0])>0) or we are
278e0 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74   the.  ** a virt
278f0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
27900 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
27910 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
27920 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
27930 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
27940 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
27950 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
27960 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
27970 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
27980 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
27990 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
279a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
279b0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
279c0 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
279d0 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
279e0 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
279f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27a00 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
27a10 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70  .  pageFlags = p
27a20 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  Page->aData[0];.
27a30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
27a40 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
27a50 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
27a60 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
27a70 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
27a80 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
27a90 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
27aa0 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  pgnoOld[i];.    
27ab0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
27ac0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27ad0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
27ae0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
27af0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
27b00 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
27b10 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27b30 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
27b40 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
27b50 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
27b60 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
27b70 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d  w[i], pgnoNew[i-
27b80 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
27b90 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
27ba0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
27bb0 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
27bc0 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
27bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 65 72 6f  ;.    }.    zero
27be0 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
27bf0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
27c00 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
27c10 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
27c20 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
27c30 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
27c40 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
27c50 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
27c60 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
27c70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
27c80 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
27c90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
27ca0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
27cb0 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
27cc0 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
27cd0 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
27ce0 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
27cf0 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
27d00 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
27d10 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
27d20 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
27d30 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
27d40 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
27d50 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
27d60 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
27d70 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
27d80 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
27d90 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
27da0 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
27db0 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
27dc0 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
27dd0 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
27de0 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
27df0 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
27e00 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
27e10 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
27e20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
27e30 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
27e40 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
27e50 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
27e60 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
27e70 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
27e80 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
27e90 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
27ea0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
27eb0 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
27ec0 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
27ed0 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
27ee0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
27ef0 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
27f00 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
27f10 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
27f20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
27f30 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
27f40 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
27f50 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
27f60 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
27f70 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
27f80 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
27f90 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
27fa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27fb0 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
27fc0 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
27fd0 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
27fe0 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
27ff0 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
28000 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
28010 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
28020 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
28030 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
28040 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
28050 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
28060 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
28070 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
28080 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
28090 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
280a0 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
280b0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
280c0 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
280d0 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
280e0 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
280f0 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
28100 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
28110 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
28120 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
28130 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
28140 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
28150 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
28160 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
28170 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
28180 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
28190 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
281a0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
281b0 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
281c0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
281d0 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
281e0 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
281f0 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
28200 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
28210 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
28220 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
28230 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
28240 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
28250 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
28260 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
28270 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
28280 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
28290 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
282a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
282b0 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
282c0 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
282d0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
282e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
282f0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
28300 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
28310 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
28320 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
28330 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
28340 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
28350 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
28360 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
28370 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
28380 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
28390 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
283a0 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
283b0 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
283c0 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
283d0 77 3d 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65 66  w==0 );..#ifndef
283e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
283f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f 2a 20 49  OVACUUM.    /* I
28400 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
28410 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
28420 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
28430 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
28440 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
28450 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
28460 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
28470 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
28480 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
28490 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
284a0 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
284b0 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
284c0 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
284d0 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
284e0 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
284f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28500 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28510 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
28520 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
28530 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
28540 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
28550 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
28560 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
28570 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
28580 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
28590 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
285a0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
285b0 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
285c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
285d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
285e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
285f0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28600 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
28610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28620 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
28630 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
28640 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
28650 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
28660 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
28670 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
28680 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
28690 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
286a0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
286b0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
286c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
286d0 69 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43  i<nNew-1 && j<nC
286e0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
286f0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
28700 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
28710 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
28720 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
28730 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
28740 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
28750 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
28760 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
28770 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
28780 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
28790 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
287a0 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
287b0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ell, 4);.       
287c0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
287d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
287e0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
287f0 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
28800 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
28810 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
28820 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
28830 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
28840 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
28850 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
28860 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
28870 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
28880 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
28890 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
288a0 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
288b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
288c0 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
288d0 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
288e0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
288f0 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
28900 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
28910 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
28920 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73    j--;.        s
28930 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
28940 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
28950 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
28960 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
28970 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
28980 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e  ;.        fillIn
28990 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43  Cell(pParent, pC
289a0 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
289b0 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29  y, 0, 0, 0, &sz)
289c0 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
289d0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
289e0 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
289f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
28a00 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
28a10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
28a20 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
28a30 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70   -= 4;.        p
28a40 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
28a50 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
28a60 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
28a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
28a80 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
28a90 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
28aa0 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
28ab0 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
28ac0 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
28ad0 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
28ae0 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
28af0 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
28b00 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
28b10 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
28b20 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
28b30 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
28b40 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
28b50 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
28b60 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
28b70 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
28b80 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
28b90 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
28ba0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
28bb0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
28bc0 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
28bd0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
28be0 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
28bf0 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
28c00 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
28c10 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
28c20 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
28c30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28c40 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
28c50 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
28c60 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
28c70 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
28c80 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
28c90 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
28ca0 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
28cb0 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
28cc0 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
28cd0 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
28ce0 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
28cf0 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
28d00 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
28d10 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
28d20 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
28d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
28d40 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
28d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
28d60 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
28d70 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
28d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28d90 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
28da0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
28db0 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
28dc0 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20  , pTemp, 4);.   
28dd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28de0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
28df0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
28e00 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
28e10 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
28e20 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65  rent,nxDiv), pNe
28e30 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  w->pgno);.#ifnde
28e40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28e50 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
28e60 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
28e70 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
28e80 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20  base, and not a 
28e90 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a  leaf-data tree,.
28ea0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70        ** then up
28eb0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
28ec0 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74   map with an ent
28ed0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
28ee0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
28ef0 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20  * that the cell 
28f00 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f  just inserted po
28f10 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29  ints to (if any)
28f20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28f30 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
28f40 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74  cuum && !leafDat
28f50 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  a ){.        rc 
28f60 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
28f70 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b  pParent, nxDiv);
28f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28fa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
28fb0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28fd0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b  #endif.      j++
28fe0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
28ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
29000 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
29010 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
29020 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
29030 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
29040 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
29050 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
29060 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
29070 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
29080 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
29090 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
290a0 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d    }.  if( nxDiv=
290b0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b  =pParent->nCell+
290c0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
290d0 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67  ow ){.    /* Rig
290e0 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
290f0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
29100 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
29110 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  nt */.    put4by
29120 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
29130 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
29140 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
29150 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65  w[nNew-1]);.  }e
29160 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  lse{.    /* Righ
29170 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
29180 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  s the left child
29190 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e   of the first en
291a0 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20  try in pParent. 
291b0 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72     ** past the r
291c0 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65  ight-most divide
291d0 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70  r entry */.    p
291e0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
291f0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
29200 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65  , nxDiv), pgnoNe
29210 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a  w[nNew-1]);.  }.
29220 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72  .  /*.  ** Repar
29230 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  ent children of 
29240 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  all cells..  */.
29250 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
29260 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  w; i++){.    rc 
29270 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
29280 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  ages(apNew[i]);.
29290 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
292a0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
292b0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
292c0 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e  }.  rc = reparen
292d0 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72  tChildPages(pPar
292e0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
292f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
29300 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
29310 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c  ;..  /*.  ** Bal
29320 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
29330 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  page.  Note that
29340 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
29350 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a  e (pPage) might.
29360 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61    ** have been a
29370 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
29380 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74  list so it might
29390 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e   no longer be in
293a0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
293b0 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  But the parent p
293c0 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  age will always 
293d0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
293e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
293f0 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
29400 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
29410 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20  (pParent, 0);.  
29420 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
29430 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
29440 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
29450 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
29460 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c  ite3_free(apCell
29470 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
29480 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
29490 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
294a0 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
294b0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
294c0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
294d0 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
294e0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
294f0 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41  (pParent);.  TRA
29500 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
29510 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20  nished with %d: 
29520 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
29530 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
29540 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
29550 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43  , nOld, nNew, nC
29560 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell));.  return 
29570 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
29580 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
29590 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
295a0 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
295b0 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
295c0 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
295d0 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
295e0 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
295f0 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
29600 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
29610 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
29620 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
29630 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65  nce_shallower(Me
29640 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
29650 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
29660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29670 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   The only child 
29680 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  page of pPage */
29690 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
296a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
296b0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
296c0 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69  or pChild */.  i
296d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
296e0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
296f0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
29700 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
29710 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
29720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29730 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42     /* The main B
29740 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  Tree structure *
29750 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65  /.  int mxCellPe
29760 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  rPage;          
29770 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
29780 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20  er of cells per 
29790 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
297a0 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
297b0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
297c0 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62  lls from pages b
297d0 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
297e0 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
297f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29800 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
29810 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20   all cells */.. 
29820 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
29830 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
29840 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29850 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
29860 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
29870 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
29880 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
29890 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
298a0 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
298b0 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
298c0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
298d0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43  ite3_malloc( mxC
298e0 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65  ellPerPage*(size
298f0 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75  of(u8*)+sizeof(u
29900 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70  16)) );.  if( ap
29910 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
29920 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
29930 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
29940 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65  &apCell[mxCellPe
29950 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50  rPage];.  if( pP
29960 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
29970 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73   /* The table is
29980 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
29990 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28  y */.    TRACE((
299a0 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20  "BALANCE: empty 
299b0 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61  table %d\n", pPa
299c0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65  ge->pgno));.  }e
299d0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
299e0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
299f0 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63  ty but has one c
29a00 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20  hild.  Transfer 
29a10 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  the.    ** infor
29a20 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74  mation from that
29a30 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20   one child into 
29a40 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66  the root page if
29a50 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
29a60 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75   fit.  This redu
29a70 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66  ces the depth of
29a80 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65   the tree by one
29a90 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
29aa0 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
29ab0 20 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68   is page 1, it h
29ac0 61 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76  as less space av
29ad0 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20  ailable than.   
29ae0 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64   ** its child (d
29af0 75 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79  ue to the 100 by
29b00 74 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f  te header that o
29b10 63 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67  ccurs at the beg
29b20 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66  inning.    ** of
29b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c   the database fl
29b40 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20  e), so it might 
29b50 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68  not be able to h
29b60 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a  old all of the .
29b70 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
29b80 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  on currently con
29b90 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68  tained in the ch
29ba0 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73  ild.  If this is
29bb0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73   the .    ** cas
29bc0 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64  e, then do not d
29bd0 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20  o the transfer. 
29be0 20 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d   Leave page 1 em
29bf0 70 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a  pty except.    *
29c00 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  * for the right-
29c10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
29c20 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
29c30 63 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d  child page becom
29c40 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69  es.    ** the vi
29c50 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  rtual root of th
29c60 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20  e tree..    */. 
29c70 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67     pgnoChild = g
29c80 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
29c90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
29ca0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
29cb0 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
29cc0 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d>0 );.    asser
29cd0 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 73 71  t( pgnoChild<=sq
29ce0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
29cf0 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  unt(pPage->pBt->
29d00 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
29d10 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
29d20 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70  GetPage(pPage->p
29d30 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26  Bt, pgnoChild, &
29d40 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20  pChild, 0);.    
29d50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
29d60 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
29d70 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
29d80 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
29d90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
29da0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68  treeInitPage(pCh
29db0 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20  ild, pPage);.   
29dc0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29dd0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
29de0 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65  ance;.      asse
29df0 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  rt( pChild->nOve
29e00 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20  rflow==0 );.    
29e10 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46    if( pChild->nF
29e20 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20  ree>=100 ){.    
29e30 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
29e40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c   information wil
29e50 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
29e60 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68  t page, so do th
29e70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  e.        ** cop
29e80 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
29e90 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f   i;.        zero
29ea0 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
29eb0 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ld->aData[0]);. 
29ec0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
29ed0 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
29ee0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
29ef0 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e   apCell[i] = fin
29f00 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b  dCell(pChild,i);
29f10 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c  .          szCel
29f20 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  l[i] = cellSizeP
29f30 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c  tr(pChild, apCel
29f40 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
29f50 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c  .        assembl
29f60 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  ePage(pPage, pCh
29f70 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65  ild->nCell, apCe
29f80 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  ll, szCell);.   
29f90 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65       /* Copy the
29fa0 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f   right-pointer o
29fb0 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74  f the child to t
29fc0 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  he parent. */.  
29fd0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
29fe0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
29ff0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2a000 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  , .            g
2a010 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d  et4byte(&pChild-
2a020 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68  >aData[pChild->h
2a030 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2a040 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28         freePage(
2a050 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  pChild);.       
2a060 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2a070 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73  : child %d trans
2a080 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22  fer to page 1\n"
2a090 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2a0a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a0b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
2a0c0 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66  ild has more inf
2a0d0 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
2a0e0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
2a0f0 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ot..        ** T
2a100 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61  he tree is alrea
2a110 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f  dy balanced.  Do
2a120 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20   nothing. */.   
2a130 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2a140 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77  ANCE: child %d w
2a150 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70  ill not fit on p
2a160 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
2a170 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2a180 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2a190 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d     memcpy(pPage-
2a1a0 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e  >aData, pChild->
2a1b0 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42  aData, pPage->pB
2a1c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
2a1d0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49        pPage->isI
2a1e0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nit = 0;.      p
2a1f0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
2a200 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
2a210 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2a220 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ge(pPage, 0);.  
2a230 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2a240 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2a250 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
2a260 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ld);.      TRACE
2a270 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e  (("BALANCE: tran
2a280 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e  sfer child %d in
2a290 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20  to root %d\n",. 
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68               pCh
2a2b0 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  ild->pgno, pPage
2a2c0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
2a2d0 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
2a2e0 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67  tChildPages(pPag
2a2f0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
2a300 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a310 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
2a320 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2a330 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
2a340 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2a350 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2a360 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2a370 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2a380 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ){ .        rc =
2a390 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2a3a0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
2a3b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a3c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2a3d0 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2a3e0 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
2a3f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2a400 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
2a410 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
2a420 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c  );.  }.end_shall
2a430 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71  ow_balance:.  sq
2a440 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c  lite3_free(apCel
2a450 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2a460 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  .}.../*.** The r
2a470 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72  oot page is over
2a480 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  full.**.** When 
2a490 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72  this happens, Cr
2a4a0 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
2a4b0 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74   page and copy t
2a4c0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
2a4d0 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20  f the root into 
2a4e0 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e  the child.  Then
2a4f0 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a   make the root.*
2a500 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20  * page an empty 
2a510 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43  page with rightC
2a520 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f  hild pointing to
2a530 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c   the new.** chil
2a540 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61  d.   Finally, ca
2a550 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72  ll balance_inter
2a560 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  nal() on the new
2a570 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75   child.** to cau
2a580 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a  se it to split..
2a590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2a5a0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d  lance_deeper(Mem
2a5b0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
2a5c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2a5d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
2a5e0 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
2a5f0 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
2a600 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
2a610 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
2a620 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2a630 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
2a640 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ld;     /* Page 
2a650 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
2a660 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
2a670 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2a680 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a690 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75  BTree */.  int u
2a6a0 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  sableSize;     /
2a6b0 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73  * Total usable s
2a6c0 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f  ize of a page */
2a6d0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2a6e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2a6f0 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  t of the parent 
2a700 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64  page */.  u8 *cd
2a710 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
2a720 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2a730 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2a740 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
2a750 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2a760 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20   page header in 
2a770 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  parent */.  int 
2a780 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
2a790 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e  /* Offset to con
2a7a0 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65  tent of first ce
2a7b0 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  ll in parent */.
2a7c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a7d0 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a  ->pParent==0 );.
2a7e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a7f0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
2a800 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
2a810 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
2a820 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2a830 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2a840 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2a850 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2a860 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c  Child, &pgnoChil
2a870 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  d, pPage->pgno, 
2a880 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
2a890 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65  eturn rc;.  asse
2a8a0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2a8b0 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  Iswriteable(pChi
2a8c0 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ld->pDbPage) );.
2a8d0 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
2a8e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
2a8f0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2a900 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
2a910 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2a920 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
2a930 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
2a940 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c  .  cdata = pChil
2a950 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63  d->aData;.  memc
2a960 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b  py(cdata, &data[
2a970 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c  hdr], pPage->cel
2a980 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d  lOffset+2*pPage-
2a990 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d  >nCell-hdr);.  m
2a9a0 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b  emcpy(&cdata[brk
2a9b0 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75  ], &data[brk], u
2a9c0 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a  sableSize-brk);.
2a9d0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2a9e0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
2a9f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2aa00 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2aa10 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28  d, pPage);.  if(
2aa20 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2aa30 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20  cedeeper_out;.  
2aa40 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
2aa50 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76  Ovfl, pPage->aOv
2aa60 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  fl, pPage->nOver
2aa70 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67  flow*sizeof(pPag
2aa80 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  e->aOvfl[0]));. 
2aa90 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2aaa0 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ow = pPage->nOve
2aab0 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68  rflow;.  if( pCh
2aac0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ild->nOverflow )
2aad0 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46  {.    pChild->nF
2aae0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ree = 0;.  }.  a
2aaf0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2ab00 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
2ab10 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  ll );.  zeroPage
2ab20 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2ab30 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
2ab40 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
2ab50 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2ab60 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2ab70 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
2ab80 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2ab90 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
2aba0 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61   into %d\n", pPa
2abb0 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ge->pgno, pChild
2abc0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65  ->pgno));.#ifnde
2abd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2abe0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
2abf0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2ac00 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
2ac10 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2ac20 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  pBt, pChild->pgn
2ac30 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2ac40 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2ac50 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2ac60 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
2ac70 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ut;.    for(i=0;
2ac80 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
2ac90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
2aca0 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
2acb0 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20  (pChild, i);.   
2acc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2acd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ace0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2acf0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
2ad00 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e  dif.  rc = balan
2ad10 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c  ce_nonroot(pChil
2ad20 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70  d);..balancedeep
2ad30 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  er_out:.  releas
2ad40 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2ad50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ad60 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74  *.** Decide if t
2ad70 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65  he page pPage ne
2ad80 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
2ad90 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e  ed.  If balancin
2ada0 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64  g is.** required
2adb0 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f  , call the appro
2adc0 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
2add0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
2ade0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
2adf0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2ae00 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69  int insert){.  i
2ae10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ae20 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  K;.  assert( sql
2ae30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ae40 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2ae50 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
2ae60 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b  e->pParent==0 ){
2ae70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ae80 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2ae90 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2aea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2aeb0 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
2aec0 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
2aed0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
2aee0 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20  eeper(pPage);.  
2aef0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2af00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
2af10 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
2af20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2af30 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61  ce_shallower(pPa
2af40 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ge);.    }.  }el
2af50 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
2af60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
2af70 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73  | .        (!ins
2af80 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ert && pPage->nF
2af90 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ree>pPage->pBt->
2afa0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20  usableSize*2/3) 
2afb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2afc0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
2afd0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
2afe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aff0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2b000 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
2b010 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
2b020 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
2b030 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
2b040 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
2b050 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
2b060 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
2b070 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
2b080 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2b090 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
2b0a0 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
2b0b0 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
2b0c0 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
2b0d0 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
2b0e0 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
2b0f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
2b100 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
2b110 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
2b120 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
2b130 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2b140 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
2b150 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64  ED..**.** In add
2b160 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e  ition to checkin
2b170 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73  g for read-locks
2b180 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c   (where a read-l
2b190 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20  ock .** means a 
2b1a0 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69  cursor opened wi
2b1b0 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68  th wrFlag==0) th
2b1c0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
2b1d0 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69  moves.** all wri
2b1e0 74 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68  te cursors so th
2b1f0 61 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  at they are poin
2b200 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ting to the .** 
2b210 66 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68  first Cell on th
2b220 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68  e root page.  Th
2b230 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
2b240 62 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72  because an inser
2b250 74 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20  t .** or delete 
2b260 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
2b270 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2b280 20 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65   on a page or de
2b290 6c 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65  lete.** a page e
2b2a0 6e 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64  ntirely and we d
2b2b0 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65  o not want to le
2b2c0 61 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20  ave any cursors 
2b2d0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
2b2e0 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67  non-existant pag
2b2f0 65 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  es or cells..*/.
2b300 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
2b310 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20  ReadLocks(Btree 
2b320 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67  *pBtree, Pgno pg
2b330 6e 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72  noRoot, BtCursor
2b340 20 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42   *pExclude){.  B
2b350 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74  tCursor *p;.  Bt
2b360 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42  Shared *pBt = pB
2b370 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c  tree->pBt;.  sql
2b380 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65  ite3 *db = pBtre
2b390 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
2b3a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2b3b0 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
2b3c0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2b3d0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2b3e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2b3f0 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
2b400 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2b410 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
2b420 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
2b430 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2b440 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f  pgnoRoot!=pgnoRo
2b450 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ot ) continue;. 
2b460 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
2b470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2b480 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20  ite3 *dbOther = 
2b490 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  p->pBtree->db;. 
2b4a0 20 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72       if( dbOther
2b4b0 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ==0 ||.         
2b4c0 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20  (dbOther!=db && 
2b4d0 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20  (dbOther->flags 
2b4e0 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
2b4f0 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b  ommitted)==0) ){
2b500 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b510 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2b520 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b530 20 69 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70   if( p->pPage->p
2b540 67 6e 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74  gno!=p->pgnoRoot
2b550 20 29 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f   ){.      moveTo
2b560 52 6f 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Root(p);.    }. 
2b570 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2b580 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2b590 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
2b5a0 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
2b5b0 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
2b5c0 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
2b5d0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e  SIZE(pBt) bytes.
2b5e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b5f0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
2b600 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
2b610 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
2b620 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
2b630 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
2b640 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 4d  sqlite3_malloc(M
2b650 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2b660 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2b670 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
2b680 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
2b690 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
2b6a0 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
2b6b0 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
2b6c0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
2b6d0 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
2b6e0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
2b6f0 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
2b700 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
2b710 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
2b720 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
2b730 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
2b740 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2b750 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2b760 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
2b770 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
2b780 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
2b790 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
2b7a0 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
2b7b0 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
2b7c0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
2b7d0 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
2b7e0 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
2b7f0 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
2b800 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b810 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
2b820 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2b830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b840 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2b850 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
2b860 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2b870 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2b880 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2b890 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
2b8a0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
2b8b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2b8c0 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
2b8d0 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
2b8e0 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2b8f0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b910 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2b920 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
2b930 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
2b940 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b960 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2b970 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2b980 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2b990 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2b9a0 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d    int szNew;.  M
2b9b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2b9c0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
2b9d0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
2b9e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2b9f0 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2ba00 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20  har *oldCell;.  
2ba10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e  unsigned char *n
2ba20 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61  ewCell = 0;..  a
2ba30 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2ba40 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2ba50 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2ba60 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2ba70 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2ba80 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2ba90 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2baa0 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
2bab0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74   */.    rc = pBt
2bac0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2bad0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2bae0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2baf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2bb00 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2bb10 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2bb20 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2bb30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2bb40 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2bb50 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20  Cursor not open 
2bb60 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2bb70 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2bb80 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2bb90 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2bba0 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b 0a 20  Root, pCur) ){. 
2bbb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bbc0 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2bbd0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2bbe0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2bbf0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  lock */.  }.  if
2bc00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2bc10 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
2bc20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
2bc30 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >skip;.  }..  /*
2bc40 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
2bc50 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
2bc60 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2bc70 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2bc80 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69   clearCursorPosi
2bc90 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
2bca0 28 20 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ( .    SQLITE_OK
2bcb0 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  !=(rc = saveAllC
2bcc0 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72  ursors(pBt, pCur
2bcd0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2bce0 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45  )) ||.    SQLITE
2bcf0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
2bd00 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  e3BtreeMoveto(pC
2bd10 75 72 2c 20 70 4b 65 79 2c 20 30 2c 20 6e 4b 65  ur, pKey, 0, nKe
2bd20 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26  y, appendBias, &
2bd30 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  loc)).  ){.    r
2bd40 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2bd50 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
2bd60 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2bd70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
2bd80 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
2bd90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2bda0 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61  f || !pPage->lea
2bdb0 66 44 61 74 61 20 29 3b 0a 20 20 54 52 41 43 45  fData );.  TRACE
2bdc0 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
2bdd0 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
2bde0 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
2bdf0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
2be00 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2be10 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
2be20 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
2be30 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
2be40 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
2be50 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
2be60 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2be70 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54  t );.  allocateT
2be80 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
2be90 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e   newCell = pBt->
2bea0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28  pTmpSpace;.  if(
2beb0 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
2bec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2bed0 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
2bee0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
2bef0 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
2bf00 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
2bf10 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
2bf20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2bf30 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
2bf40 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
2bf50 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
2bf60 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
2bf70 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
2bf80 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
2bf90 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26  .  if( loc==0 &&
2bfa0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
2bfb0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2bfc0 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20     u16 szOld;.  
2bfd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bfe0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
2bff0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
2c000 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2c010 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c020 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2c030 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2c040 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
2c050 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ert;.    }.    o
2c060 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
2c070 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2c080 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
2c090 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2c0a0 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
2c0b0 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
2c0c0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
2c0d0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2c0e0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2c0f0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2c100 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
2c110 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2c120 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2c130 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
2c140 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2c150 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20  szOld);.  }else 
2c160 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61  if( loc<0 && pPa
2c170 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ge->nCell>0 ){. 
2c180 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c190 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43  ->leaf );.    pC
2c1a0 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70  ur->idx++;.    p
2c1b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2c1c0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
2c1d0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
2c1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2c1f0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
2c200 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73  ;.  }.  rc = ins
2c210 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2c220 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c  Cur->idx, newCel
2c230 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
2c240 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c250 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
2c260 69 6e 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62  insert;.  rc = b
2c270 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29  alance(pPage, 1)
2c280 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74  ;.  /* sqlite3Bt
2c290 72 65 65 50 61 67 65 44 75 6d 70 28 70 43 75 72  reePageDump(pCur
2c2a0 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2c2b0 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20  oRoot, 1); */.  
2c2c0 2f 2a 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  /* fflush(stdout
2c2d0 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  ); */.  if( rc==
2c2e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c2f0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2c300 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
2c310 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
2c320 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2c330 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
2c340 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
2c350 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
2c360 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2c370 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2c380 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2c390 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2c3a0 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
2c3b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2c3c0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2c3d0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73  ur->pPage;.  uns
2c3e0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2c3f0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  l;.  int rc;.  P
2c400 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
2c410 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  0;.  Btree *p = 
2c420 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2c430 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2c440 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
2c450 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2c460 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2c470 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2c480 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42  Init );.  if( pB
2c490 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2c4a0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2c4b0 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2c4c0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2c4d0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20   before doing a 
2c4e0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63  delete */.    rc
2c4f0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2c500 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2c510 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2c520 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2c530 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2c540 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2c550 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2c560 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2c570 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2c580 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2c590 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
2c5a0 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   >= pPage->nCell
2c5b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2c5c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
2c5d0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
2c5e0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
2c5f0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2c600 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2c610 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2c620 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2c630 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20  /* Did not open 
2c640 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20  this cursor for 
2c650 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2c660 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2c670 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2c680 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2c690 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
2c6a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2c6b0 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2c6c0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2c6d0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2c6e0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
2c6f0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
2c700 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2c710 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  n (a no-op if th
2c720 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2c730 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f  in .  ** CURSOR_
2c740 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
2c750 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20  e) and save the 
2c760 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2c770 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a   other cursors .
2c780 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65    ** open on the
2c790 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65   same table. The
2c7a0 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  n call sqlite3Pa
2c7b0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
2c7c0 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74  e page.  ** that
2c7d0 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20   the entry will 
2c7e0 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e  be deleted from.
2c7f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
2c800 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72   (rc = restoreOr
2c810 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2c820 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c  ion(pCur))!=0 ||
2c830 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
2c840 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2c850 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2c860 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2c870 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2c880 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2c890 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b  DbPage))!=0.  ){
2c8a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2c8b0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
2c8c0 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
2c8d0 20 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65   its page and le
2c8e0 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
2c8f0 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
2c900 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
2c910 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
2c920 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2c930 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2c940 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
2c950 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
2c960 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
2c970 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20  t..  */.  pCell 
2c980 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2c990 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
2c9a0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c9b0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   ){.    pgnoChil
2c9c0 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2c9d0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ll);.  }.  rc = 
2c9e0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2c9f0 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72   pCell);.  if( r
2ca00 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2ca10 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  rc;.  }..  if( !
2ca20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2ca30 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
2ca40 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
2ca50 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
2ca60 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
2ca70 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
2ca80 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
2ca90 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
2caa0 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
2cab0 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
2cac0 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
2cad0 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
2cae0 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
2caf0 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
2cb00 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
2cb10 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
2cb20 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
2cb30 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
2cb40 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
2cb50 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
2cb60 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
2cb70 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
2cb80 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75  r leafCur;.    u
2cb90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2cba0 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74  ext;.    int not
2cbb0 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
2cbc0 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
2cbd0 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
2cbe0 74 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44  t( !pPage->leafD
2cbf0 61 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ata );.    sqlit
2cc00 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
2cc10 72 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66  rsor(pCur, &leaf
2cc20 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Cur);.    rc = s
2cc30 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2cc40 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73  &leafCur, &notUs
2cc50 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
2cc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cc70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cc80 50 61 67 65 72 57 72 69 74 65 28 6c 65 61 66 43  PagerWrite(leafC
2cc90 75 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ur.pPage->pDbPag
2cca0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2ccb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ccc0 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e  ){.      u16 szN
2ccd0 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ext;.      TRACE
2cce0 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65  (("DELETE: table
2ccf0 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72  =%d delete inter
2cd00 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c  nal from %d repl
2cd10 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ace from leaf %d
2cd20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43  \n",.         pC
2cd30 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2cd40 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43  age->pgno, leafC
2cd50 75 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ur.pPage->pgno))
2cd60 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  ;.      dropCell
2cd70 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2cd80 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2cd90 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2cda0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e       pNext = fin
2cdb0 64 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50  dCell(leafCur.pP
2cdc0 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78  age, leafCur.idx
2cdd0 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20  );.      szNext 
2cde0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65  = cellSizePtr(le
2cdf0 61 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65  afCur.pPage, pNe
2ce00 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xt);.      asser
2ce10 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  t( MX_CELL_SIZE(
2ce20 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29  pBt)>=szNext+4 )
2ce30 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65  ;.      allocate
2ce40 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
2ce50 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d        tempCell =
2ce60 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
2ce70 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43  .      if( tempC
2ce80 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
2ce90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2cea0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2ceb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2cec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ced0 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
2cee0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2cef0 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78  , pNext-4, szNex
2cf00 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30  t+4, tempCell, 0
2cf10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2cf20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cf30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
2cf40 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2cf50 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  lowCell(pPage, p
2cf60 43 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43  Cur->idx), pgnoC
2cf70 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72  hild);.        r
2cf80 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67  c = balance(pPag
2cf90 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
2cfa0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2cfb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cfc0 20 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43    dropCell(leafC
2cfd0 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75  ur.pPage, leafCu
2cfe0 72 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a  r.idx, szNext);.
2cff0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
2d000 61 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61  ance(leafCur.pPa
2d010 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ge, 0);.      }.
2d020 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2d030 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
2d040 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72  pCursor(&leafCur
2d050 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d060 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20  TRACE(("DELETE: 
2d070 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20  table=%d delete 
2d080 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2d090 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67  .       pCur->pg
2d0a0 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70  noRoot, pPage->p
2d0b0 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43  gno));.    dropC
2d0c0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2d0d0 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74  >idx, cellSizePt
2d0e0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
2d0f0 3b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e  ;.    rc = balan
2d100 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2d110 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2d120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
2d130 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2d140 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2d150 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2d160 61 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c  a new BTree tabl
2d170 65 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  e.  Write into *
2d180 70 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65  piTable the page
2d190 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
2d1a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2d1b0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  the new table..*
2d1c0 2a 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66  *.** The type of
2d1d0 20 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69   type is determi
2d1e0 6e 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73  ned by the flags
2d1f0 20 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c   parameter.  Onl
2d200 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  y the.** followi
2d210 6e 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61  ng values of fla
2d220 67 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  gs are currently
2d230 20 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20   in use.  Other 
2d240 76 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c  values for.** fl
2d250 61 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f  ags might not wo
2d260 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54  rk:.**.**     BT
2d270 52 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45  REE_INTKEY|BTREE
2d280 5f 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73  _LEAFDATA     Us
2d290 65 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65  ed for SQL table
2d2a0 73 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79  s with rowid key
2d2b0 73 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a  s.**     BTREE_Z
2d2c0 45 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20  ERODATA         
2d2d0 20 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f           Used fo
2d2e0 72 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f  r SQL indices.*/
2d2f0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2d300 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72  eCreateTable(Btr
2d310 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61  ee *p, int *piTa
2d320 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ble, int flags){
2d330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2d340 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
2d350 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50  Page *pRoot;.  P
2d360 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  gno pgnoRoot;.  
2d370 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
2d380 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2d390 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2d3a0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
2d3b0 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f  nsaction!=TRANS_
2d3c0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  WRITE ){.    /* 
2d3d0 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  Must start a tra
2d3e0 6e 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a  nsaction first *
2d3f0 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  /.    rc = pBt->
2d400 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2d410 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2d420 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  ITE_ERROR;.    r
2d430 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2d440 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
2d450 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65  adOnly );..#ifde
2d460 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2d470 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
2d480 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2d490 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2d4a0 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2d4b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2d4c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2d4d0 23 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d  #else.  if( pBt-
2d4e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2d4f0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65     Pgno pgnoMove
2d500 3b 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61  ;      /* Move a
2d510 20 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61   page here to ma
2d520 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
2d530 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20  root-page */.   
2d540 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d   MemPage *pPageM
2d550 6f 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65  ove; /* The page
2d560 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a   to move to. */.
2d570 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67  .    /* Creating
2d580 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79   a new table may
2d590 20 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72   probably requir
2d5a0 65 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73  e moving an exis
2d5b0 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20  ting database.  
2d5c0 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f    ** to make roo
2d5d0 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  m for the new ta
2d5e0 62 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20  bles root page. 
2d5f0 49 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67  In case this pag
2d600 65 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f  e turns.    ** o
2d610 75 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72  ut to be an over
2d620 66 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74  flow page, delet
2d630 65 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70  e all overflow p
2d640 61 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20  age-map caches. 
2d650 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70     ** held by op
2d660 65 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20  en cursors..    
2d670 2a 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  */.    invalidat
2d680 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
2d690 65 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  e(pBt);..    /* 
2d6a0 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
2d6b0 66 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74  f meta[3] from t
2d6c0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
2d6d0 65 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74  etermine where t
2d6e0 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70  he.    ** root p
2d6f0 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2d700 61 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20  able should go. 
2d710 6d 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c  meta[3] is the l
2d720 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
2d730 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
2d740 73 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e  so far, so the n
2d750 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  ew root-page is 
2d760 28 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20  (meta[3]+1)..   
2d770 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2d780 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
2d790 28 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74  (p, 4, &pgnoRoot
2d7a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d7b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d7c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d7d0 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b   }.    pgnoRoot+
2d7e0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e  +;..    /* The n
2d7f0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79  ew root-page may
2d800 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65   not be allocate
2d810 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d on a pointer-m
2d820 61 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a  ap page, or the.
2d830 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42      ** PENDING_B
2d840 59 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  YTE page..    */
2d850 0a 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f  .    while( pgno
2d860 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47  Root==PTRMAP_PAG
2d870 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  ENO(pBt, pgnoRoo
2d880 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67  t) ||.        pg
2d890 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f  noRoot==PENDING_
2d8a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2d8b0 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74  {.      pgnoRoot
2d8c0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ++;.    }.    as
2d8d0 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d  sert( pgnoRoot>=
2d8e0 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  3 );..    /* All
2d8f0 6f 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68  ocate a page. Th
2d900 65 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72  e page that curr
2d910 65 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74  ently resides at
2d920 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20   pgnoRoot will. 
2d930 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74     ** be moved t
2d940 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2d950 70 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65  page (unless the
2d960 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2d970 68 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74  happens.    ** t
2d980 6f 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f  o reside at pgno
2d990 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Root)..    */.  
2d9a0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2d9b0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2d9c0 50 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d  PageMove, &pgnoM
2d9d0 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31  ove, pgnoRoot, 1
2d9e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d9f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2da00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2da10 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   }..    if( pgno
2da20 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Move!=pgnoRoot )
2da30 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52  {.      /* pgnoR
2da40 6f 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20  oot is the page 
2da50 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
2da60 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  d for the root-p
2da70 61 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  age of.      ** 
2da80 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61  the new table (a
2da90 73 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72  ssuming an error
2daa0 20 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e   did not occur).
2dab0 20 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20   But we were.   
2dac0 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
2dad0 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71  pgnoMove. If req
2dae0 75 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69  uired (i.e. if i
2daf0 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  t was not alloca
2db00 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  ted.      ** by 
2db10 65 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69  extending the fi
2db20 6c 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74  le), the current
2db30 20 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f   page at positio
2db40 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20  n pgnoMove.     
2db50 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a   ** is already j
2db60 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20  ournaled..      
2db70 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  */.      u8 eTyp
2db80 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50  e;.      Pgno iP
2db90 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72  trPage;..      r
2dba0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2dbb0 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Move);..      /*
2dbc0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63   Move the page c
2dbd0 75 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f  urrently at pgno
2dbe0 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65  Root to pgnoMove
2dbf0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2dc00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2dc10 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  age(pBt, pgnoRoo
2dc20 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20  t, &pRoot, 0);. 
2dc30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2dc40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dc50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2dc60 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
2dc70 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70  ptrmapGet(pBt, p
2dc80 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c  gnoRoot, &eType,
2dc90 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
2dca0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2dcb0 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50  E_OK || eType==P
2dcc0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c  TRMAP_ROOTPAGE |
2dcd0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
2dce0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
2dcf0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2dd00 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2dd10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2dd20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2dd30 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
2dd40 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20  OOTPAGE );.     
2dd50 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
2dd60 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2dd70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
2dd80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2dd90 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2dda0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2ddb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ddc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ddd0 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2dde0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2ddf0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65   }.      rc = re
2de00 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
2de10 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50  pRoot, eType, iP
2de20 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65  trPage, pgnoMove
2de30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2de40 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20  Page(pRoot);..  
2de50 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68      /* Obtain th
2de60 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f  e page at pgnoRo
2de70 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
2de80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2de90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2dea0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2deb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2dec0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ded0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
2dee0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2def0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2df00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2df10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2df20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2df30 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
2df40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2df50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2df60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2df70 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2df80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2df90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2dfa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
2dfb0 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
2dfc0 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
2dfd0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2dfe0 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
2dff0 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
2e000 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
2e010 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
2e020 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2e030 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
2e040 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
2e050 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e060 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2e070 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
2e080 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2e090 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2e0a0 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
2e0b0 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
2e0c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e0d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2e0e0 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
2e0f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
2e100 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
2e110 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2e120 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2e130 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2e140 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2e150 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
2e160 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
2e170 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e180 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
2e190 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
2e1a0 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
2e1b0 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
2e1c0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2e1d0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2e1e0 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
2e1f0 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
2e200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e210 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2e220 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
2e230 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
2e240 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
2e250 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2e260 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2e270 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
2e280 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
2e290 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
2e2a0 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
2e2b0 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
2e2c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2e2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e2e0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
2e2f0 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
2e300 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
2e310 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
2e320 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
2e330 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2e340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2e350 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
2e360 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2e370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2e380 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
2e390 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
2e3a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
2e3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e3c0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
2e3d0 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ar */.  MemPage 
2e3e0 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
2e3f0 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e   Parent page.  N
2e400 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ULL for the root
2e410 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61   */.  int freePa
2e420 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44  geFlag      /* D
2e430 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69  eallocate page i
2e440 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d  f true */.){.  M
2e450 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2e460 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
2e470 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2e480 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ell;.  int i;.. 
2e490 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e4a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2e4b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2e4c0 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67   pgno>sqlite3Pag
2e4d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
2e4e0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
2e4f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2e500 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2e510 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
2e520 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
2e530 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e  , &pPage, pParen
2e540 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  t);.  if( rc ) g
2e550 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2e560 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
2e570 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2e580 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2e590 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2e5a0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2e5b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2e5c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
2e5d0 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2e5e0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
2e5f0 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50  Cell), pPage->pP
2e600 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20  arent, 1);.     
2e610 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2e620 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e630 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2e640 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2e650 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2e660 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2e670 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2e680 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
2e690 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e6a0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
2e6b0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2e6c0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2e6d0 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61  ->aData[8]), pPa
2e6e0 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2e6f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2e700 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2e710 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2e720 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
2e730 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
2e740 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2e750 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
2e760 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e770 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2e780 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72  ))==0 ){.    zer
2e790 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  oPage(pPage, pPa
2e7a0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50  ge->aData[0] | P
2e7b0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63  TF_LEAF);.  }..c
2e7c0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e7d0 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
2e7e0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2e7f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e800 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66  * Delete all inf
2e810 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
2e820 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
2e830 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69  the database.  i
2e840 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20  Table is.** the 
2e850 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2e860 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2e870 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69  able.  After thi
2e880 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2e890 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s,.** the root p
2e8a0 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75  age is empty, bu
2e8b0 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a  t still exists..
2e8c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2e8d0 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
2e8e0 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
2e8f0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
2e900 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75   open.** read cu
2e910 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
2e920 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20  le.  Open write 
2e930 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65  cursors are move
2e940 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  d to the.** root
2e950 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2e960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2e970 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72  eeClearTable(Btr
2e980 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2e990 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
2e9a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2e9b0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
2e9c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
2e9d0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
2e9e0 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  b;.  if( p->inTr
2e9f0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2ea00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
2ea10 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2ea20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2ea30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2ea40 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 63  else if( (rc = c
2ea50 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
2ea60 20 69 54 61 62 6c 65 2c 20 30 29 29 21 3d 53 51   iTable, 0))!=SQ
2ea70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
2ea80 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
2ea90 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53  */.  }else if( S
2eaa0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2eab0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2eac0 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20  Bt, iTable, 0)) 
2ead0 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
2eae0 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
2eaf0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  se{.    rc = cle
2eb00 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2eb10 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
2eb20 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
2eb30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2eb40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2eb50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2eb60 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2eb70 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
2eb80 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
2eb90 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
2eba0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
2ebb0 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
2ebc0 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
2ebd0 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
2ebe0 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
2ebf0 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
2ec00 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
2ec10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ec20 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2ec30 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2ec40 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2ec50 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
2ec60 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
2ec70 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
2ec80 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
2ec90 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
2eca0 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
2ecb0 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
2ecc0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2ecd0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
2ece0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
2ecf0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2ed00 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
2ed10 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
2ed20 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2ed30 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
2ed40 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
2ed50 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
2ed60 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
2ed70 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
2ed80 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2ed90 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
2eda0 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
2edb0 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
2edc0 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
2edd0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2ede0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2edf0 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
2ee00 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
2ee10 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
2ee20 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
2ee30 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
2ee40 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
2ee50 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
2ee60 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
2ee70 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
2ee80 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
2ee90 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
2eea0 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
2eeb0 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
2eec0 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
2eed0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
2eee0 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
2eef0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2ef00 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
2ef10 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
2ef20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74  procedure..*/.st
2ef30 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72  atic int btreeDr
2ef40 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
2ef50 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
2ef60 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
2ef70 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2ef80 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42   *pPage = 0;.  B
2ef90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2efa0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2efb0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2efc0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2efd0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2efe0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2eff0 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2f000 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2f010 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2f020 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2f030 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
2f040 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
2f050 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
2f060 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
2f070 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
2f080 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2f090 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2f0a0 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
2f0b0 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
2f0c0 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
2f0d0 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
2f0e0 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
2f0f0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
2f100 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
2f110 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
2f120 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
2f130 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
2f140 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
2f150 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
2f160 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
2f170 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2f180 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  D;.  }..  rc = s
2f190 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2f1a0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2f1b0 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29  able, &pPage, 0)
2f1c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2f1d0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
2f1e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2f1f0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29  Table(p, iTable)
2f200 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2f210 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2f220 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2f230 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d   rc;.  }..  *piM
2f240 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  oved = 0;..  if(
2f250 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66   iTable>1 ){.#if
2f260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f270 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72  AUTOVACUUM.    r
2f280 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2f290 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ge);.    release
2f2a0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c  Page(pPage);.#el
2f2b0 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  se.    if( pBt->
2f2c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2f2d0 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74      Pgno maxRoot
2f2e0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pgno;.      rc =
2f2f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2f300 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52  Meta(p, 4, &maxR
2f310 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ootPgno);.      
2f320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f330 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2f340 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2f350 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f360 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2f370 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d     if( iTable==m
2f380 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20  axRootPgno ){.  
2f390 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2f3a0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
2f3b0 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65  ped is the table
2f3c0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
2f3d0 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2f3e0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
2f3f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70   the database, p
2f400 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ut the root page
2f410 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
2f420 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t. .        */. 
2f430 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2f440 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2f450 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f460 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2f470 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f480 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f490 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f4a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2f4b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2f4c0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
2f4d0 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61  pped does not ha
2f4e0 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  ve the largest r
2f4f0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
2f500 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
2f510 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d  e database. So m
2f520 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ove the page tha
2f530 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20  t does into the 
2f540 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20  .        ** gap 
2f550 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
2f560 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20  ted root-page.. 
2f570 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f580 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65    MemPage *pMove
2f590 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2f5a0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2f5b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f5c0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2f5d0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2f5e0 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
2f5f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f610 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f630 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
2f640 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50  ge(pBt, pMove, P
2f650 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2f660 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  0, iTable);.    
2f670 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f680 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
2f690 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f6a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2f6b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f6c0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2f6d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2f6e0 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
2f6f0 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
2f700 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f710 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f720 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2f730 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2f740 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2f750 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
2f760 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2f770 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2f780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f790 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f7a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69     }.        *pi
2f7c0 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50  Moved = maxRootP
2f7d0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
2f7e0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e      /* Set the n
2f7f0 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67  ew 'max-root-pag
2f800 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  e' value in the 
2f810 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
2f820 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
2f830 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  s the old value 
2f840 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f  less one, less o
2f850 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20  ne more if that 
2f860 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20  happens to.     
2f870 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61   ** be a root-pa
2f880 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ge number, less 
2f890 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61  one again if tha
2f8a0 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  t is the.      *
2f8b0 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  * PENDING_BYTE_P
2f8c0 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  AGE..      */.  
2f8d0 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
2f8e0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78  -;.      if( max
2f8f0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  RootPgno==PENDIN
2f900 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2f910 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
2f920 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
2f930 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78   }.      if( max
2f940 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50  RootPgno==PTRMAP
2f950 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78  _PAGENO(pBt, max
2f960 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20  RootPgno) ){.   
2f970 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
2f980 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
2f990 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f    assert( maxRoo
2f9a0 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  tPgno!=PENDING_B
2f9b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2f9c0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
2f9d0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
2f9e0 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f  eta(p, 4, maxRoo
2f9f0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  tPgno);.    }els
2fa00 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
2fa10 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
2fa20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fa30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  (pPage);.    }.#
2fa40 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
2fa50 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33     /* If sqlite3
2fa60 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77  BtreeDropTable w
2fa70 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67  as called on pag
2fa80 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f  e 1. */.    zero
2fa90 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f  Page(pPage, PTF_
2faa0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20  INTKEY|PTF_LEAF 
2fab0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
2fac0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
2fad0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
2fae0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2faf0 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20  DropTable(Btree 
2fb00 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  *p, int iTable, 
2fb10 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20  int *piMoved){. 
2fb20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2fb30 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2fb40 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
2fb50 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
2fb60 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20  reeDropTable(p, 
2fb70 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29  iTable, piMoved)
2fb80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2fb90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2fba0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2fbb0 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69   Read the meta-i
2fbc0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
2fbd0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
2fbe0 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  e.  Meta[0].** i
2fbf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2fc00 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65  free pages curre
2fc10 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntly in the data
2fc20 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a  base.  Meta[1].*
2fc30 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31  * through meta[1
2fc40 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  5] are available
2fc50 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68   for use by high
2fc60 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61  er layers.  Meta
2fc70 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f  [0].** is read-o
2fc80 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20  nly, the others 
2fc90 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a  are read/write..
2fca0 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  ** .** The schem
2fcb0 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20  a layer numbers 
2fcc0 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66  meta values diff
2fcd0 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65  erently.  At the
2fce0 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72   schema.** layer
2fcf0 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f   (and the SetCoo
2fd00 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b  kie and ReadCook
2fd10 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20  ie opcodes) the 
2fd20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65  number of.** fre
2fd30 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76  e pages is not v
2fd40 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b  isible.  So Cook
2fd50 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d  ie[0] is the sam
2fd60 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f  e as Meta[1]..*/
2fd70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2fd80 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a  eGetMeta(Btree *
2fd90 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
2fda0 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67  *pMeta){.  DbPag
2fdb0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e  e *pDbPage;.  in
2fdc0 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
2fdd0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74   char *pP1;.  Bt
2fde0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2fdf0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
2fe00 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
2fe10 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
2fe20 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20  ;..  /* Reading 
2fe30 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75  a meta-data valu
2fe40 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61  e requires a rea
2fe50 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
2fe60 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a   (and hence.  **
2fe70 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2fe80 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61  er table. We gra
2fe90 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61  b this lock rega
2fea0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2feb0 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  r or.  ** not th
2fec0 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  e SQLITE_ReadUnc
2fed0 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
2fee0 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20   set (the table 
2fef0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20  rooted at page. 
2ff00 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64   ** 1 is treated
2ff10 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
2ff20 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65  se by queryTable
2ff30 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54  Lock() and lockT
2ff40 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20  able())..  */.  
2ff50 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
2ff60 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c  ock(p, 1, READ_L
2ff70 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
2ff80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ff90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2ffa0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
2ffb0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
2ffc0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
2ffd0 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d  dx<=15 );.  rc =
2ffe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2fff0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c  (pBt->pPager, 1,
30000 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
30010 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
30020 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
30030 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
30040 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e  .  }.  pP1 = (un
30050 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
30060 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
30070 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  a(pDbPage);.  *p
30080 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
30090 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
300a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
300b0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
300c0 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61  ..  /* If autova
300d0 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c  cuumed is disabl
300e0 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
300f0 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69   but we are tryi
30100 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65  ng to .  ** acce
30110 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d  ss an autovacuum
30120 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
30130 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62  n make the datab
30140 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20  ase readonly. . 
30150 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
30160 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30170 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26  M.  if( idx==4 &
30180 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74  & *pMeta>0 ) pBt
30190 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
301a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61  #endif..  /* Gra
301b0 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  b the read-lock 
301c0 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
301d0 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
301e0 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
301f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
30200 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
30210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
30220 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d  rite meta-inform
30230 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20  ation back into 
30240 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
30250 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61  eta[0] is.** rea
30260 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e  d-only and may n
30270 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a  ot be written..*
30280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30290 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72  eeUpdateMeta(Btr
302a0 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
302b0 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74  u32 iMeta){.  Bt
302c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
302d0 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
302e0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e   char *pP1;.  in
302f0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
30300 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31  idx>=1 && idx<=1
30310 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
30320 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
30330 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
30340 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
30350 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
30360 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
30370 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
30380 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
30390 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
303a0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
303b0 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b  Bt->pPage1!=0 );
303c0 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  .    pP1 = pBt->
303d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
303e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
303f0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
30400 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
30410 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
30420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30430 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  put4byte(&pP1[36
30440 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61   + idx*4], iMeta
30450 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30460 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30470 4d 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d  M.      if( idx=
30480 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =7 ){.        as
30490 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
304a0 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d  acuum || iMeta==
304b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
304c0 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c  ert( iMeta==0 ||
304d0 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20   iMeta==1 );.   
304e0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
304f0 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20  cuum = iMeta;.  
30500 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30510 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
30520 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
30530 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30540 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
30550 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65  flag byte at the
30560 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
30570 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
30580 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
30590 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
305a0 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
305b0 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43  e3BtreeFlags(BtC
305c0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
305d0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62  /* TODO: What ab
305e0 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49  out CURSOR_REQUI
305f0 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72  RESEEK state? Pr
30600 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63  obably need to c
30610 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  all.  ** restore
30620 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
30630 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
30640 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
30650 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72  age;.  restoreOr
30660 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
30670 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61  ion(pCur);.  pPa
30680 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30690 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
306a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
306b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
306c0 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72  pPage->pBt==pCur
306d0 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72  ->pBt );.  retur
306e0 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d  n pPage ? pPage-
306f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
30700 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a  rOffset] : 0;.}.
30710 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
30720 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
30730 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65  ted with a BTree
30740 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
30750 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
30760 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
30770 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61  ging only..*/.Pa
30780 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  ger *sqlite3Btre
30790 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29  ePager(Btree *p)
307a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
307b0 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69  t->pPager;.}..#i
307c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
307d0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
307e0 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
307f0 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
30800 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
30810 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
30820 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
30830 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
30840 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
30850 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
30860 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
30870 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
30880 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
30890 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21 70  *zMsg2;.  if( !p
308a0 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72  Check->mxErr ) r
308b0 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d  eturn;.  pCheck-
308c0 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65  >mxErr--;.  pChe
308d0 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61  ck->nErr++;.  va
308e0 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
308f0 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73  at);.  zMsg2 = s
30900 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 30  qlite3VMPrintf(0
30910 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
30920 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
30930 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a  if( zMsg1==0 ) z
30940 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28  Msg1 = "";.  if(
30950 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
30960 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
30970 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72  ld = pCheck->zEr
30980 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b  rMsg;.    pCheck
30990 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
309a0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
309b0 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
309c0 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22  rMsg, zOld, "\n"
309d0 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
309e0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
309f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64  qlite3_free(zOld
30a00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30a10 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
30a20 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  (&pCheck->zErrMs
30a30 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c  g, zMsg1, zMsg2,
30a40 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a   (char*)0);.  }.
30a50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
30a60 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Msg2);.}.#endif 
30a70 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
30a80 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
30a90 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
30aa0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
30ab0 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64  _CHECK./*.** Add
30ac0 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65   1 to the refere
30ad0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
30ae0 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68  ge iPage.  If th
30af0 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
30b00 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
30b10 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61   the page, add a
30b20 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
30b30 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  to pCheck->zErrM
30b40 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  sg..** Return 1 
30b50 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f  if there are 2 o
30b60 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63  re more referenc
30b70 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  es to the page a
30b80 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68  nd 0 if.** if th
30b90 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
30ba0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
30bb0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73   page..**.** Als
30bc0 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
30bd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
30be0 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74  in bounds..*/.st
30bf0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
30c00 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70  f(IntegrityCk *p
30c10 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65  Check, int iPage
30c20 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74  , char *zContext
30c30 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  ){.  if( iPage==
30c40 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
30c50 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b  if( iPage>pCheck
30c60 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65  ->nPage || iPage
30c70 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  <0 ){.    checkA
30c80 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30c90 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61   zContext, "inva
30ca0 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
30cb0 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
30cc0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
30cd0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52   if( pCheck->anR
30ce0 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a  ef[iPage]==1 ){.
30cf0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
30d00 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
30d10 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65  ext, "2nd refere
30d20 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c  nce to page %d",
30d30 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
30d40 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
30d50 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e  urn  (pCheck->an
30d60 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b  Ref[iPage]++)>1;
30d70 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
30d80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30d90 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  UM./*.** Check t
30da0 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e  hat the entry in
30db0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
30dc0 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64   for page iChild
30dd0 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67   maps to .** pag
30de0 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74  e iParent, point
30df0 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e  er type ptrType.
30e00 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20   If not, append 
30e10 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
30e20 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a  .** to pCheck..*
30e30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
30e40 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74  eckPtrmap(.  Int
30e50 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
30e60 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  ,   /* Integrity
30e70 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a   check context *
30e80 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
30e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
30ea0 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ild page number 
30eb0 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
30ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
30ed0 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
30ee0 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67  map type */.  Pg
30ef0 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20  no iParent,     
30f00 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
30f10 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72   pointer map par
30f20 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
30f30 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
30f40 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ext         /* C
30f50 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69  ontext descripti
30f60 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72  on (used for err
30f70 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20  or msg) */.){.  
30f80 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74  int rc;.  u8 ePt
30f90 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f  rmapType;.  Pgno
30fa0 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a   iPtrmapParent;.
30fb0 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65  .  rc = ptrmapGe
30fc0 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69  t(pCheck->pBt, i
30fd0 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54  Child, &ePtrmapT
30fe0 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72  ype, &iPtrmapPar
30ff0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
31000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31010 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31020 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31030 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61  , "Failed to rea
31040 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22  d ptrmap key=%d"
31050 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72  , iChild);.    r
31060 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
31070 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65  ( ePtrmapType!=e
31080 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50  Type || iPtrmapP
31090 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29  arent!=iParent )
310a0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
310b0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
310c0 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42  ntext, .      "B
310d0 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79  ad ptr map entry
310e0 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64   key=%d expected
310f0 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64  =(%d,%d) got=(%d
31100 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43  ,%d)", .      iC
31110 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61  hild, eType, iPa
31120 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70  rent, ePtrmapTyp
31130 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  e, iPtrmapParent
31140 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
31150 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
31160 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
31170 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66  e freelist or of
31180 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
31190 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66  e list..** Verif
311a0 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
311b0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
311c0 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a  e list is N..*/.
311d0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
311e0 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69  kList(.  Integri
311f0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
31200 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
31210 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  king context */.
31220 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74    int isFreeList
31230 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
31240 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20  for a freelist. 
31250 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66   False for overf
31260 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  low page list */
31270 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
31280 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31290 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73   number for firs
312a0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  t page in the li
312b0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  st */.  int N,  
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
312d0 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
312e0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
312f0 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
31300 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
31310 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
31320 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
31330 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
31340 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e  int expected = N
31350 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d  ;.  int iFirst =
31360 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28   iPage;.  while(
31370 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65   N-- > 0 && pChe
31380 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20  ck->mxErr ){.   
31390 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61   DbPage *pOvflPa
313a0 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ge;.    unsigned
313b0 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61   char *pOvflData
313c0 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3c  ;.    if( iPage<
313d0 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
313e0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
313f0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
31400 20 20 20 20 20 22 25 64 20 6f 66 20 25 64 20 70       "%d of %d p
31410 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f  ages missing fro
31420 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  m overflow list 
31430 73 74 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c  starting at %d",
31440 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20  .          N+1, 
31450 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73 74  expected, iFirst
31460 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
31470 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
31480 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
31490 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20  Page, zContext) 
314a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
314b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
314c0 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c  (pCheck->pPager,
314d0 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70   (Pgno)iPage, &p
314e0 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20  OvflPage) ){.   
314f0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31500 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31510 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67  xt, "failed to g
31520 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  et page %d", iPa
31530 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ge);.      break
31540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66  ;.    }.    pOvf
31550 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65  lData = (unsigne
31560 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
31570 50 61 67 65 72 47 65 74 44 61 74 61 28 70 4f 76  PagerGetData(pOv
31580 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  flPage);.    if(
31590 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20   isFreeList ){. 
315a0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74       int n = get
315b0 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61  4byte(&pOvflData
315c0 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [4]);.#ifndef SQ
315d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
315e0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
315f0 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
31600 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
31610 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
31620 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52  heck, iPage, PTR
31630 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
31640 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
31650 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
31660 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70   if( n>pCheck->p
31670 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
31680 2d 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  -8 ){.        ch
31690 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
316a0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
316b0 20 20 20 20 20 20 20 20 20 20 22 66 72 65 65 6c            "freel
316c0 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74  ist leaf count t
316d0 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25  oo big on page %
316e0 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
316f0 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d      N--;.      }
31700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
31710 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
31720 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  {.          Pgno
31730 20 69 46 72 65 65 50 61 67 65 20 3d 20 67 65 74   iFreePage = get
31740 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61  4byte(&pOvflData
31750 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65  [8+i*4]);.#ifnde
31760 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31770 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
31780 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
31790 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
317a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
317b0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
317c0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52  , iFreePage, PTR
317d0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
317e0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
317f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31800 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65           checkRe
31810 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  f(pCheck, iFreeP
31820 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
31830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31840 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20    N -= n;.      
31850 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
31860 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
31870 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b  VACUUM.    else{
31880 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
31890 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  s database suppo
318a0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  rts auto-vacuum 
318b0 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74  and iPage is not
318c0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20   the last.      
318d0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
318e0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63  overflow list, c
318f0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f  heck that the po
31900 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
31910 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  for.      ** the
31920 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20   following page 
31930 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20  matches iPage.. 
31940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31950 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
31960 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30  utoVacuum && N>0
31970 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
31980 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61  get4byte(pOvflDa
31990 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65  ta);.        che
319a0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
319b0 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46   i, PTRMAP_OVERF
319c0 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW2, iPage, zCo
319d0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
319e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
319f0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
31a00 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20  e(pOvflData);.  
31a10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
31a20 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a  ref(pOvflPage);.
31a30 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
31a40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
31a50 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
31a60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31a70 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
31a80 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72  ECK./*.** Do var
31a90 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65 63  ious sanity chec
31aa0 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70  ks on a single p
31ab0 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20  age of a tree.  
31ac0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72  Return.** the tr
31ad0 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20  ee depth.  Root 
31ae0 70 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20  pages return 0. 
31af0 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74   Parents of root
31b00 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e   pages.** return
31b10 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68   1, and so forth
31b20 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63  ..** .** These c
31b30 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a  hecks are done:.
31b40 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d  **.**      1.  M
31b50 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65  ake sure that ce
31b60 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63  lls and freebloc
31b70 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61  ks do not overla
31b80 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75  p.**          bu
31b90 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d  t combine to com
31ba0 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68  pletely cover th
31bb0 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20  e page..**  NO  
31bc0 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65  2.  Make sure ce
31bd0 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f  ll keys are in o
31be0 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e  rder..**  NO  3.
31bf0 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b    Make sure no k
31c00 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ey is less than 
31c10 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77  or equal to zLow
31c20 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20  erBound..**  NO 
31c30 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   4.  Make sure n
31c40 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74 65 72  o key is greater
31c50 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
31c60 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a  o zUpperBound..*
31c70 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b  *      5.  Check
31c80 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
31c90 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
31ca0 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65  ..**      6.  Re
31cb0 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63  cursively call c
31cc0 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20  heckTreePage on 
31cd0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a  all children..**
31ce0 20 20 20 20 20 20 37 2e 20 20 56 65 72 69 66 79        7.  Verify
31cf0 20 74 68 61 74 20 74 68 65 20 64 65 70 74 68 20   that the depth 
31d00 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
31d10 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20  is the same..** 
31d20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75       8.  Make su
31d30 72 65 20 74 68 69 73 20 70 61 67 65 20 69 73 20  re this page is 
31d40 61 74 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c  at least 33% ful
31d50 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a  l or else it is.
31d60 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20  **          the 
31d70 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65  root of the tree
31d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31d90 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20  checkTreePage(. 
31da0 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
31db0 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78  heck,  /* Contex
31dc0 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79  t for the sanity
31dd0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
31de0 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  iPage,          
31df0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
31e00 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
31e10 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61  check */.  MemPa
31e20 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
31e30 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
31e40 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65  */.  char *zPare
31e50 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61  ntContext  /* Pa
31e60 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rent context */.
31e70 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
31e80 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63  age;.  int i, rc
31e90 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e  , depth, d2, pgn
31ea0 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64  o, cnt;.  int hd
31eb0 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20  r, cellStart;.  
31ec0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  int nCell;.  u8 
31ed0 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  *data;.  BtShare
31ee0 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75 73  d *pBt;.  int us
31ef0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72  ableSize;.  char
31f00 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a   zContext[100];.
31f10 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20    char *hit;..  
31f20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31f30 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
31f40 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61  ), zContext, "Pa
31f50 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29  ge %d: ", iPage)
31f60 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
31f70 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73  at the page exis
31f80 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20  ts.  */.  pBt = 
31f90 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75  pCheck->pBt;.  u
31fa0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
31fb0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
31fc0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
31fd0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68  turn 0;.  if( ch
31fe0 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
31ff0 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e  Page, zParentCon
32000 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30  text) ) return 0
32010 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  ;.  if( (rc = sq
32020 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
32030 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61  e(pBt, (Pgno)iPa
32040 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
32050 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
32060 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
32070 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
32080 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74    "unable to get
32090 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72   the page. error
320a0 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a   code=%d", rc);.
320b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
320c0 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  }.  if( (rc = sq
320d0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
320e0 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ge(pPage, pParen
320f0 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  t))!=0 ){.    ch
32100 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32110 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  eck, zContext, .
32120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32130 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65 65     "sqlite3Btree
32140 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72  InitPage() retur
32150 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64  ns error code %d
32160 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65  ", rc);.    rele
32170 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
32180 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
32190 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75  }..  /* Check ou
321a0 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e  t all the cells.
321b0 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20  .  */.  depth = 
321c0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
321d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20  pPage->nCell && 
321e0 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69  pCheck->mxErr; i
321f0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
32200 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ll;.    int sz;.
32210 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
32220 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  o;..    /* Check
32230 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f   payload overflo
32240 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20  w pages.    */. 
32250 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
32260 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
32270 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  ext), zContext,.
32280 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e               "On
32290 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63 65   tree page %d ce
322a0 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c  ll %d: ", iPage,
322b0 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d   i);.    pCell =
322c0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
322d0 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  i);.    sqlite3B
322e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
322f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
32300 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20  info);.    sz = 
32310 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
32320 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
32330 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e  ey ) sz += info.
32340 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74  nKey;.    assert
32350 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ( sz==info.nPayl
32360 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73  oad );.    if( s
32370 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  z>info.nLocal ){
32380 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
32390 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c   = (sz - info.nL
323a0 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a  ocal + usableSiz
323b0 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69  e - 5)/(usableSi
323c0 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50  ze - 4);.      P
323d0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
323e0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
323f0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
32400 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32410 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32420 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
32430 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
32440 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
32450 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66  (pCheck, pgnoOvf
32460 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
32470 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW1, iPage, zCon
32480 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
32490 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63  endif.      chec
324a0 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c  kList(pCheck, 0,
324b0 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65   pgnoOvfl, nPage
324c0 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
324d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
324e0 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20   sanity of left 
324f0 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
32500 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
32510 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
32520 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
32530 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  (pCell);.#ifndef
32540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32550 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
32560 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
32570 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
32580 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
32590 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
325a0 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  REE, iPage, zCon
325b0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
325c0 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d  endif.      d2 =
325d0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
325e0 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65  Check,pgno,pPage
325f0 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ,zContext);.    
32600 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21    if( i>0 && d2!
32610 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  =depth ){.      
32620 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32630 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
32640 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64  t, "Child page d
32650 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a  epth differs");.
32660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
32670 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a  pth = d2;.    }.
32680 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
32690 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
326a0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
326b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
326c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
326d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
326e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
326f0 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
32700 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
32710 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61 67           "On pag
32720 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68  e %d at right ch
32730 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a  ild: ", iPage);.
32740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32750 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
32760 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
32770 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
32780 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
32790 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
327a0 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30  _BTREE, iPage, 0
327b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
327c0 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
327d0 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  e(pCheck, pgno, 
327e0 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  pPage, zContext)
327f0 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65  ;.  }. .  /* Che
32800 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20  ck for complete 
32810 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20  coverage of the 
32820 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61  page.  */.  data
32830 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
32840 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
32850 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74  hdrOffset;.  hit
32860 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
32870 5a 65 72 6f 28 20 75 73 61 62 6c 65 53 69 7a 65  Zero( usableSize
32880 20 29 3b 0a 20 20 69 66 28 20 68 69 74 20 29 7b   );.  if( hit ){
32890 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74 2c  .    memset(hit,
328a0 20 31 2c 20 67 65 74 32 62 79 74 65 28 26 64 61   1, get2byte(&da
328b0 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20 20 20  ta[hdr+5]));.   
328c0 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
328d0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
328e0 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74 20 3d  .    cellStart =
328f0 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
32900 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 66  age->leaf;.    f
32910 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
32920 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
32930 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
32940 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74 2b 69  data[cellStart+i
32950 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31 36 20  *2]);.      u16 
32960 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
32970 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
32980 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  pc]);.      int 
32990 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 63  j;.      if( (pc
329a0 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
329b0 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29 7b 0a  Size || pc<0 ){.
329c0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
329d0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
329e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
329f0 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
32a00 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
32a10 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
32a20 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
32a30 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
32a40 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d  j=pc+size-1; j>=
32a50 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  pc; j--) hit[j]+
32a60 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
32a70 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30 2c 20  .    for(cnt=0, 
32a80 69 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  i=get2byte(&data
32a90 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20 26 26  [hdr+1]); i>0 &&
32aa0 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20 26 26   i<usableSize &&
32ab0 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20 20 20   cnt<10000; .   
32ac0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29 7b 0a          cnt++){.
32ad0 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
32ae0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
32af0 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74  i+2]);.      int
32b00 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   j;.      if( (i
32b10 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62 6c 65  +size-1)>=usable
32b20 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b 0a 20  Size || i<0 ){. 
32b30 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
32b40 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
32b50 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22    .            "
32b60 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74 65 63  Corruption detec
32b70 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64 20 6f  ted in cell %d o
32b80 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69 50 61  n page %d",i,iPa
32b90 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge,0);.      }el
32ba0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
32bb0 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69  j=i+size-1; j>=i
32bc0 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b  ; j--) hit[j]++;
32bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32be0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
32bf0 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  a[i]);.    }.   
32c00 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20 69 3c   for(i=cnt=0; i<
32c10 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b 2b 29  usableSize; i++)
32c20 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69 74 5b  {.      if( hit[
32c30 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
32c40 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65   cnt++;.      }e
32c50 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d 3e 31  lse if( hit[i]>1
32c60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
32c70 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
32c80 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  k, 0,.          
32c90 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73 20 66  "Multiple uses f
32ca0 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20 70 61  or byte %d of pa
32cb0 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61 67 65  ge %d", i, iPage
32cc0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
32cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32ce0 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64 61 74      if( cnt!=dat
32cf0 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20 20 20  a[hdr+7] ){.    
32d00 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32d10 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20  (pCheck, 0, .   
32d20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65 6e 74         "Fragment
32d30 65 64 20 73 70 61 63 65 20 69 73 20 25 64 20 62  ed space is %d b
32d40 79 74 65 20 72 65 70 6f 72 74 65 64 20 61 73 20  yte reported as 
32d50 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 0a  %d on page %d",.
32d60 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c 20 64            cnt, d
32d70 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50 61 67  ata[hdr+7], iPag
32d80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
32d90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69 74  sqlite3_free(hit
32da0 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  );..  releasePag
32db0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
32dc0 72 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65  rn depth+1;.}.#e
32dd0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32de0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32df0 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
32e00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
32e10 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
32e20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
32e30 6f 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63  oes a complete c
32e40 68 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65  heck of the give
32e50 6e 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61  n BTree file.  a
32e60 52 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20  Root[] is.** an 
32e70 61 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e  array of pages n
32e80 75 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68  umbers were each
32e90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
32ea0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
32eb0 0a 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52  .** a table.  nR
32ec0 6f 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  oot is the numbe
32ed0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
32ee0 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aRoot..**.** If 
32ef0 65 76 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b  everything check
32f00 73 20 6f 75 74 2c 20 74 68 69 73 20 72 6f 75 74  s out, this rout
32f10 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
32f20 2e 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  .  If something 
32f30 69 73 0a 2a 2a 20 61 6d 69 73 73 2c 20 61 6e 20  is.** amiss, an 
32f40 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
32f50 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
32f60 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
32f70 6f 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61  om malloc().** a
32f80 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
32f90 74 68 61 74 20 65 72 72 6f 72 20 6d 65 73 73 61  that error messa
32fa0 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ge is returned. 
32fb0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
32fc0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70  ction.** is resp
32fd0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
32fe0 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ing the error me
32ff0 73 73 61 67 65 20 77 68 65 6e 20 69 74 20 69 73  ssage when it is
33000 20 64 6f 6e 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a   done..*/.char *
33010 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
33020 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42 74  grityCheck(.  Bt
33030 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20 54  ree *p,     /* T
33040 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 63  he btree to be c
33050 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  hecked */.  int 
33060 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e 20  *aRoot,   /* An 
33070 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70 61  array of root pa
33080 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ges numbers for 
33090 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65 73  individual trees
330a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74 2c   */.  int nRoot,
330b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
330c0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
330d0 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 45  t[] */.  int mxE
330e0 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20 72  rr,    /* Stop r
330f0 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73 20  eporting errors 
33100 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79 20  after this many 
33110 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72 20  */.  int *pnErr 
33120 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62     /* Write numb
33130 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
33140 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61 62  n to this variab
33150 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  le */.){.  int i
33160 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20  ;.  int nRef;.  
33170 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68 65  IntegrityCk sChe
33180 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ck;.  BtShared *
33190 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
331a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
331b0 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
331c0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e 52 65 66   = p->db;.  nRef
331d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
331e0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
331f0 67 65 72 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b  ger);.  if( lock
33200 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
33210 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
33220 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
33230 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
33240 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 44  turn sqlite3StrD
33250 75 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63  up("Unable to ac
33260 71 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63  quire a read loc
33270 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
33280 65 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63  e");.  }.  sChec
33290 6b 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73  k.pBt = pBt;.  s
332a0 43 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70  Check.pPager = p
332b0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43  Bt->pPager;.  sC
332c0 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c  heck.nPage = sql
332d0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
332e0 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72  nt(sCheck.pPager
332f0 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72  );.  sCheck.mxEr
33300 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68  r = mxErr;.  sCh
33310 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20  eck.nErr = 0;.  
33320 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e  *pnErr = 0;.#ifn
33330 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33340 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
33350 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20   pBt->nTrunc!=0 
33360 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50  ){.    sCheck.nP
33370 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  age = pBt->nTrun
33380 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
33390 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  if( sCheck.nPage
333a0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  ==0 ){.    unloc
333b0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
333c0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
333d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
333e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
333f0 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  .  sCheck.anRef 
33400 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
33410 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b  ( (sCheck.nPage+
33420 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b  1)*sizeof(sCheck
33430 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20  .anRef[0]) );.  
33440 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65  if( !sCheck.anRe
33450 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  f ){.    unlockB
33460 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
33470 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20  );.    *pnErr = 
33480 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  1;.    sqlite3Bt
33490 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
334a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d   return sqlite3M
334b0 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 22 55  Printf(p->db, "U
334c0 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  nable to malloc 
334d0 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20  %d bytes", .    
334e0 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67      (sCheck.nPag
334f0 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
33500 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20  ck.anRef[0]));. 
33510 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
33520 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69  =sCheck.nPage; i
33530 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65  ++){ sCheck.anRe
33540 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20  f[i] = 0; }.  i 
33550 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
33560 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20  AGE(pBt);.  if( 
33570 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
33580 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e  ){.    sCheck.an
33590 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a  Ref[i] = 1;.  }.
335a0 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67    sCheck.zErrMsg
335b0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   = 0;..  /* Chec
335c0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
335d0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  of the freelist.
335e0 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74    */.  checkList
335f0 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74  (&sCheck, 1, get
33600 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
33610 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a  e1->aData[32]),.
33620 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
33630 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
33640 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22  1->aData[36]), "
33650 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22  Main freelist: "
33660 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61  );..  /* Check a
33670 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20  ll the tables.. 
33680 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
33690 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b  <nRoot && sCheck
336a0 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  .mxErr; i++){.  
336b0 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d    if( aRoot[i]==
336c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  0 ) continue;.#i
336d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
336e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
336f0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33700 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d  cuum && aRoot[i]
33710 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  >1 ){.      chec
33720 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c  kPtrmap(&sCheck,
33730 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41   aRoot[i], PTRMA
33740 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30  P_ROOTPAGE, 0, 0
33750 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
33760 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
33770 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  e(&sCheck, aRoot
33780 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66  [i], 0, "List of
33790 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b   tree roots: ");
337a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
337b0 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20  sure every page 
337c0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  in the file is r
337d0 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20  eferenced.  */. 
337e0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68   for(i=1; i<=sCh
337f0 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68  eck.nPage && sCh
33800 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
33810 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
33820 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33830 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
33840 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  Ref[i]==0 ){.   
33850 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33860 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
33870 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
33880 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
33890 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66  .#else.    /* If
338a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
338b0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
338c0 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f  um, make sure no
338d0 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a   tables contain.
338e0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
338f0 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s to pointer-map
33900 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   pages..    */. 
33910 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
33920 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20  Ref[i]==0 && .  
33930 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
33940 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c  ENO(pBt, i)!=i |
33950 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  | !pBt->autoVacu
33960 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
33970 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
33980 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
33990 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
339a0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   i);.    }.    i
339b0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
339c0 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]!=0 && .      
339d0 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
339e0 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42  pBt, i)==i && pB
339f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
33a00 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
33a10 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
33a20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20  0, "Pointer map 
33a30 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72  page %d is refer
33a40 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20  enced", i);.    
33a50 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
33a60 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  /* Make sure thi
33a70 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e  s analysis did n
33a80 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72  ot leave any unr
33a90 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a  ef() pages.  */.
33aa0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
33ab0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66  nused(pBt);.  if
33ac0 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65  ( nRef != sqlite
33ad0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
33ae0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
33af0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33b00 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20  g(&sCheck, 0, . 
33b10 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e       "Outstandin
33b20 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65  g page count goe
33b30 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20  s from %d to %d 
33b40 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c  during this anal
33b50 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65  ysis",.      nRe
33b60 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f, sqlite3PagerR
33b70 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
33b80 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  ger).    );.  }.
33b90 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20  .  /* Clean  up 
33ba0 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72  and report error
33bb0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
33bc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
33bd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
33be0 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
33bf0 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e  *pnErr = sCheck.
33c00 6e 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73  nErr;.  return s
33c10 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d  Check.zErrMsg;.}
33c20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33c30 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
33c40 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _CHECK */../*.**
33c50 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
33c60 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
33c70 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
33c80 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
33c90 20 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e   The pager filen
33ca0 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74  ame is invariant
33cb0 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   as long as the 
33cc0 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e  pager is.** open
33cd0 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   so it is safe t
33ce0 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74  o access without
33cf0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75   the BtShared mu
33d00 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  tex..*/.const ch
33d10 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
33d20 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65  GetFilename(Btre
33d30 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
33d40 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
33d50 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
33d60 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
33d70 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
33d80 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
33d90 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
33da0 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f  e of the directo
33db0 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
33dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33dd0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
33de0 67 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ger directory na
33df0 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
33e00 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
33e10 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
33e20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
33e30 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
33e40 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
33e50 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
33e60 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
33e70 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20  etDirname(Btree 
33e80 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
33e90 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30  ->pBt->pPager!=0
33ea0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
33eb0 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
33ec0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  (p->pBt->pPager)
33ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
33ee0 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f  n the pathname o
33ef0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
33f00 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  le for this data
33f10 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e  base. The return
33f20 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69  .** value of thi
33f30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
33f40 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73   same regardless
33f50 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
33f60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
33f70 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
33f80 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54   or not..**.** T
33f90 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c  he pager journal
33fa0 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
33fb0 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
33fc0 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
33fd0 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
33fe0 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
33ff0 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
34000 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
34010 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
34020 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
34030 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
34040 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
34050 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
34060 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
34070 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
34080 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
34090 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
340a0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
340b0 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f  *.** Copy the co
340c0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
340d0 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70  f pBtFrom into p
340e0 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63  BtTo.  A transac
340f0 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20  tion.** must be 
34100 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20  active for both 
34110 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
34120 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54   size of file pT
34130 6f 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64  o may be reduced
34140 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
34150 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  on..** If anythi
34160 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74  ng goes wrong, t
34170 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
34180 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20  n pTo is rolled 
34190 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
341a0 73 75 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d  successful, Comm
341b0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79  itPhaseOne() may
341c0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54   be called on pT
341d0 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
341e0 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ng. .** The call
341f0 65 72 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68  er should finish
34200 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20   committing the 
34210 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70  transaction on p
34220 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a  To by calling.**
34230 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
34240 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  mit()..*/.static
34250 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69   int btreeCopyFi
34260 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
34270 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
34280 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34290 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20  OK;.  Pgno i;.. 
342a0 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b   Pgno nFromPage;
342b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
342c0 66 20 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d  f pages in pFrom
342d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61   */.  Pgno nToPa
342e0 67 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ge;       /* Num
342f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
34300 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e  pTo */.  Pgno nN
34310 65 77 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20  ewPage;      /* 
34320 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
34330 69 6e 20 70 54 6f 20 61 66 74 65 72 20 74 68 65  in pTo after the
34340 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f   copy */..  Pgno
34350 20 69 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20   iSkip;         
34360 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20  /* Pending byte 
34370 70 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20  page in pTo */. 
34380 20 69 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65   int nToPageSize
34390 3b 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a  ;    /* Page siz
343a0 65 20 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65  e of pTo in byte
343b0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d  s */.  int nFrom
343c0 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61  PageSize;  /* Pa
343d0 67 65 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d  ge size of pFrom
343e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
343f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20  BtShared *pBtTo 
34400 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74  = pTo->pBt;.  Bt
34410 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20  Shared *pBtFrom 
34420 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
34430 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d  pBtTo->db = pTo-
34440 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e  >db;.  pBtFrom->
34450 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a  db = pFrom->db;.
34460 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d  .  nToPageSize =
34470 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65   pBtTo->pageSize
34480 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  ;.  nFromPageSiz
34490 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67  e = pBtFrom->pag
344a0 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54  eSize;..  if( pT
344b0 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  o->inTrans!=TRAN
344c0 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d  S_WRITE || pFrom
344d0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
344e0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65  _WRITE ){.    re
344f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
34500 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74  R;.  }.  if( pBt
34510 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  To->pCursor ){. 
34520 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34530 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54  _BUSY;.  }..  nT
34540 6f 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  oPage = sqlite3P
34550 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
34560 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
34570 6e 46 72 6f 6d 50 61 67 65 20 3d 20 73 71 6c 69  nFromPage = sqli
34580 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
34590 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
345a0 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45  r);.  iSkip = PE
345b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
345c0 70 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61  pBtTo);..  /* Va
345d0 72 69 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20  riable nNewPage 
345e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
345f0 20 70 61 67 65 73 20 72 65 71 75 69 72 65 64 20   pages required 
34600 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a  to store the.  *
34610 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46  * contents of pF
34620 72 6f 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75  rom using the cu
34630 72 72 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20  rrent page-size 
34640 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  of pTo..  */.  n
34650 4e 65 77 50 61 67 65 20 3d 20 28 28 69 36 34 29  NewPage = ((i64)
34660 6e 46 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34  nFromPage * (i64
34670 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b  )nFromPageSize +
34680 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a   (i64)nToPageSiz
34690 65 20 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20  e - 1) / .      
346a0 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65  (i64)nToPageSize
346b0 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63  ;..  for(i=1; rc
346c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
346d0 69 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c  i<=nToPage || i<
346e0 3d 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29  =nNewPage); i++)
346f0 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  {..    /* Journa
34700 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  l the original p
34710 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
34720 2a 2a 20 69 53 6b 69 70 20 69 73 20 74 68 65 20  ** iSkip is the 
34730 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
34740 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20  he locking page 
34750 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  (PENDING_BYTE_PA
34760 47 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61  GE).    ** in da
34770 74 61 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66  tabase *pTo (bef
34780 6f 72 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54  ore the copy). T
34790 68 69 73 20 70 61 67 65 20 69 73 20 6e 65 76 65  his page is neve
347a0 72 20 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a  r written .    *
347b0 2a 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  * into the journ
347c0 61 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20  al file. Unless 
347d0 69 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20  i==iSkip or the 
347e0 70 61 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20  page was not.   
347f0 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70   ** present in p
34800 54 6f 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  To before the co
34810 70 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f  py operation, jo
34820 75 72 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f  urnal page i fro
34830 6d 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  m pTo..    */.  
34840 20 20 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26    if( i!=iSkip &
34850 26 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a  & i<=nToPage ){.
34860 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
34870 62 50 61 67 65 3b 0a 20 20 20 20 20 20 72 63 20  bPage;.      rc 
34880 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
34890 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c  t(pBtTo->pPager,
348a0 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   i, &pDbPage);. 
348b0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
348c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
348d0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
348e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
348f0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
34900 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
34910 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
34920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
34930 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20  nFromPage ){.   
34940 20 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49       /* Yeah.  I
34950 74 20 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f  t seems wierd to
34960 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28   call DontWrite(
34970 29 20 72 69 67 68 74 20 61 66 74 65 72 20 57 72  ) right after Wr
34980 69 74 65 28 29 2e 20 42 75 74 0a 20 20 20 20 20  ite(). But.     
34990 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65     ** that is be
349a0 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20  cause the names 
349b0 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75  of those procedu
349c0 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74  res do not exact
349d0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ly .        ** r
349e0 65 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68  epresent what th
349f0 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20  ey do.  Write() 
34a00 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75  really means "pu
34a10 74 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74  t this page in t
34a20 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  he.        ** ro
34a30 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
34a40 6e 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69  nd mark it as di
34a50 72 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  rty so that it w
34a60 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20  ill be written. 
34a70 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65         ** to the
34a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c   database file l
34a90 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74  ater."  DontWrit
34aa0 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73  e() undoes the s
34ab0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20  econd part of.  
34ac0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e        ** that an
34ad0 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  d prevents the p
34ae0 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77  age from being w
34af0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
34b00 74 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20  tabase. The.    
34b10 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73      ** page is s
34b20 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  till on the roll
34b30 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
34b40 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20  ough.  And that 
34b50 69 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  is the .        
34b60 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e 74 20 6f  ** whole point o
34b70 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a 20 74 6f  f this block: to
34b80 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20 74 68   put pages on th
34b90 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
34ba0 61 6c 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  al. .        */.
34bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
34bc0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44  agerDontWrite(pD
34bd0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  bPage);.      }.
34be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
34bf0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
34c00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
34c10 4f 76 65 72 77 72 69 74 65 20 74 68 65 20 64 61  Overwrite the da
34c20 74 61 20 69 6e 20 70 61 67 65 20 69 20 6f 66 20  ta in page i of 
34c30 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
34c40 61 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ase */.    if( r
34c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
34c60 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e  i!=iSkip && i<=n
34c70 4e 65 77 50 61 67 65 20 29 7b 0a 0a 20 20 20 20  NewPage ){..    
34c80 20 20 44 62 50 61 67 65 20 2a 70 54 6f 50 61 67    DbPage *pToPag
34c90 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  e = 0;.      sql
34ca0 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 3b  ite3_int64 iOff;
34cb0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
34cc0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
34cd0 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
34ce0 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pToPage);.      
34cf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34d00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
34d10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34d20 69 74 65 28 70 54 6f 50 61 67 65 29 3b 0a 20 20  ite(pToPage);.  
34d30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
34d40 28 0a 20 20 20 20 20 20 20 20 69 4f 66 66 3d 28  (.        iOff=(
34d50 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65  i-1)*nToPageSize
34d60 3b 20 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  ; .        rc==S
34d70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66  QLITE_OK && iOff
34d80 3c 69 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  <i*nToPageSize; 
34d90 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
34da0 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20   nFromPageSize. 
34db0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34dc0 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67  DbPage *pFromPag
34dd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 50  e = 0;.        P
34de0 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66  gno iFrom = (iOf
34df0 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  f/nFromPageSize)
34e00 2b 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  +1;..        if(
34e10 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f   iFrom==PENDING_
34e20 42 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f  BYTE_PAGE(pBtFro
34e30 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m) ){.          
34e40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
34e50 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
34e60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
34e70 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
34e80 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d  r, iFrom, &pFrom
34e90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
34ea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
34ec0 61 72 20 2a 7a 54 6f 20 3d 20 73 71 6c 69 74 65  ar *zTo = sqlite
34ed0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 54  3PagerGetData(pT
34ee0 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  oPage);.        
34ef0 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20    char *zFrom = 
34f00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
34f10 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a  ata(pFromPage);.
34f20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
34f30 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  opy;..          
34f40 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  if( nFromPageSiz
34f50 65 3e 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29  e>=nToPageSize )
34f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  {.            zF
34f70 72 6f 6d 20 2b 3d 20 28 28 69 2d 31 29 2a 6e 54  rom += ((i-1)*nT
34f80 6f 50 61 67 65 53 69 7a 65 20 2d 20 28 28 69 46  oPageSize - ((iF
34f90 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65  rom-1)*nFromPage
34fa0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
34fb0 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 54 6f 50      nCopy = nToP
34fc0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
34fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34fe0 20 20 20 20 20 20 7a 54 6f 20 2b 3d 20 28 28 28        zTo += (((
34ff0 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61  iFrom-1)*nFromPa
35000 67 65 53 69 7a 65 29 20 2d 20 28 69 2d 31 29 2a  geSize) - (i-1)*
35010 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b 0a 20 20  nToPageSize);.  
35020 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
35030 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b  = nFromPageSize;
35040 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
35050 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
35060 54 6f 2c 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79  To, zFrom, nCopy
35070 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
35080 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67  erUnref(pFromPag
35090 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
350a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
350b0 20 70 54 6f 50 61 67 65 20 29 20 73 71 6c 69 74   pToPage ) sqlit
350c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 6f  e3PagerUnref(pTo
350d0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
350e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 6e 67 73  ..  /* If things
350f0 20 68 61 76 65 20 77 6f 72 6b 65 64 20 73 6f 20   have worked so 
35100 66 61 72 2c 20 74 68 65 20 64 61 74 61 62 61 73  far, the databas
35110 65 20 66 69 6c 65 20 6d 61 79 20 6e 65 65 64 20  e file may need 
35120 74 6f 20 62 65 20 0a 20 20 2a 2a 20 74 72 75 6e  to be .  ** trun
35130 63 61 74 65 64 2e 20 54 68 65 20 63 6f 6d 70 6c  cated. The compl
35140 65 78 20 70 61 72 74 20 69 73 20 74 68 61 74 20  ex part is that 
35150 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
35160 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 20  e truncated to. 
35170 20 2a 2a 20 61 20 73 69 7a 65 20 74 68 61 74 20   ** a size that 
35180 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
35190 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 6e 54  r multiple of nT
351a0 6f 50 61 67 65 53 69 7a 65 20 2d 20 74 68 65 20  oPageSize - the 
351b0 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61 67  current.  ** pag
351c0 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
351d0 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
351e0 74 65 64 20 77 69 74 68 20 42 2d 54 72 65 65 20  ted with B-Tree 
351f0 70 54 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  pTo..  **.  ** F
35200 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 61 79 20  or example, say 
35210 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
35220 20 70 54 6f 20 69 73 20 32 30 34 38 20 62 79 74   pTo is 2048 byt
35230 65 73 20 61 6e 64 20 74 68 65 20 6f 72 69 67 69  es and the origi
35240 6e 61 6c 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  nal .  ** number
35250 20 6f 66 20 70 61 67 65 73 20 69 73 20 35 20 28   of pages is 5 (
35260 31 30 20 4b 42 20 66 69 6c 65 29 2e 20 49 66 20  10 KB file). If 
35270 70 46 72 6f 6d 20 68 61 73 20 61 20 70 61 67 65  pFrom has a page
35280 20 73 69 7a 65 20 6f 66 20 31 30 32 34 20 0a 20   size of 1024 . 
35290 20 2a 2a 20 62 79 74 65 73 20 61 6e 64 20 39 20   ** bytes and 9 
352a0 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
352b0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
352c0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 39 4b   truncated to 9K
352d0 42 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  B..  */.  if( rc
352e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
352f0 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65     if( nFromPage
35300 53 69 7a 65 21 3d 6e 54 6f 50 61 67 65 53 69 7a  Size!=nToPageSiz
35310 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
35320 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20 3d  e3_file *pFile =
35330 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
35340 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  e(pBtTo->pPager)
35350 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 69 7a  ;.      i64 iSiz
35360 65 20 3d 20 28 69 36 34 29 6e 46 72 6f 6d 50 61  e = (i64)nFromPa
35370 67 65 53 69 7a 65 20 2a 20 28 69 36 34 29 6e 46  geSize * (i64)nF
35380 72 6f 6d 50 61 67 65 3b 0a 20 20 20 20 20 20 69  romPage;.      i
35390 36 34 20 69 4e 6f 77 20 3d 20 28 69 36 34 29 28  64 iNow = (i64)(
353a0 28 6e 54 6f 50 61 67 65 3e 6e 4e 65 77 50 61 67  (nToPage>nNewPag
353b0 65 29 3f 6e 54 6f 50 61 67 65 3a 6e 4e 65 77 50  e)?nToPage:nNewP
353c0 61 67 65 29 20 2a 20 28 69 36 34 29 6e 54 6f 50  age) * (i64)nToP
353d0 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20  ageSize; .      
353e0 69 36 34 20 69 50 65 6e 64 69 6e 67 20 3d 20 28  i64 iPending = (
353f0 28 69 36 34 29 50 45 4e 44 49 4e 47 5f 42 59 54  (i64)PENDING_BYT
35400 45 5f 50 41 47 45 28 70 42 74 54 6f 29 2d 31 29  E_PAGE(pBtTo)-1)
35410 20 2a 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69   *(i64)nToPageSi
35420 7a 65 3b 0a 20 20 0a 20 20 20 20 20 20 61 73 73  ze;.  .      ass
35430 65 72 74 28 20 69 53 69 7a 65 3c 3d 69 4e 6f 77  ert( iSize<=iNow
35440 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20   );.  .      /* 
35450 43 6f 6d 6d 69 74 20 70 68 61 73 65 20 6f 6e 65  Commit phase one
35460 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
35470 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  al file associat
35480 65 64 20 77 69 74 68 20 70 54 6f 20 0a 20 20 20  ed with pTo .   
35490 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
354a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
354b0 74 61 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  ta. It does not 
354c0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
354d0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
354e0 69 74 73 65 6c 66 2e 20 41 66 74 65 72 20 64 6f  itself. After do
354f0 69 6e 67 20 74 68 69 73 20 69 74 20 69 73 20 73  ing this it is s
35500 61 66 65 20 74 6f 20 75 73 65 20 4f 73 54 72 75  afe to use OsTru
35510 6e 63 61 74 65 28 29 20 61 6e 64 20 6f 74 68 65  ncate() and othe
35520 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  r.      ** file 
35530 41 50 49 73 20 6f 6e 20 74 68 65 20 64 61 74 61  APIs on the data
35540 62 61 73 65 20 66 69 6c 65 20 64 69 72 65 63 74  base file direct
35550 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
35560 20 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70     pBtTo->db = p
35570 54 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 72 63  To->db;.      rc
35580 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
35590 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
355a0 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 30 2c 20  tTo->pPager, 0, 
355b0 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 1);.      if(
355c0 20 69 53 69 7a 65 3c 69 4e 6f 77 20 26 26 20 72   iSize<iNow && r
355d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
355e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
355f0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
35600 46 69 6c 65 2c 20 69 53 69 7a 65 29 3b 0a 20 20  File, iSize);.  
35610 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
35620 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74 20  * The loop that 
35630 63 6f 70 69 65 64 20 64 61 74 61 20 66 72 6f 6d  copied data from
35640 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20   database pFrom 
35650 74 6f 20 70 54 6f 20 64 69 64 20 6e 6f 74 0a 20  to pTo did not. 
35660 20 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65       ** populate
35670 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
35680 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 70 54  e of database pT
35690 6f 2e 20 49 66 20 74 68 65 20 70 61 67 65 2d 73  o. If the page-s
356a0 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ize of.      ** 
356b0 70 46 72 6f 6d 20 69 73 20 73 6d 61 6c 6c 65 72  pFrom is smaller
356c0 20 74 68 61 6e 20 74 68 61 74 20 6f 66 20 70 54   than that of pT
356d0 6f 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 6f  o, this means so
356e0 6d 65 20 64 61 74 61 20 77 69 6c 6c 0a 20 20 20  me data will.   
356f0 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20 62     ** not have b
35700 65 65 6e 20 63 6f 70 69 65 64 2e 20 0a 20 20 20  een copied. .   
35710 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
35720 68 69 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65 73  his block copies
35730 20 74 68 65 20 6d 69 73 73 69 6e 67 20 64 61 74   the missing dat
35740 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  a from database 
35750 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 0a 20 20  pFrom to pTo .  
35760 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 66 69 6c      ** using fil
35770 65 20 41 50 49 73 2e 20 54 68 69 73 20 69 73 20  e APIs. This is 
35780 73 61 66 65 20 62 65 63 61 75 73 65 20 61 74 20  safe because at 
35790 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 6b 6e  this point we kn
357a0 6f 77 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ow that.      **
357b0 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 72 69 67   all of the orig
357c0 69 6e 61 6c 20 64 61 74 61 20 66 72 6f 6d 20 70  inal data from p
357d0 54 6f 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  To has been sync
357e0 65 64 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  ed into the .   
357f0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
35800 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
35810 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 73 61  t it would be sa
35820 66 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  fe to do anythin
35830 67 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c  g at.      ** al
35840 6c 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  l to the databas
35850 65 20 66 69 6c 65 20 65 78 63 65 70 74 20 74 72  e file except tr
35860 75 6e 63 61 74 65 20 69 74 20 74 6f 20 7a 65 72  uncate it to zer
35870 6f 20 62 79 74 65 73 2e 0a 20 20 20 20 20 20 2a  o bytes..      *
35880 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
35890 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 46 72  SQLITE_OK && nFr
358a0 6f 6d 50 61 67 65 53 69 7a 65 3c 6e 54 6f 50 61  omPageSize<nToPa
358b0 67 65 53 69 7a 65 20 26 26 20 69 53 69 7a 65 3e  geSize && iSize>
358c0 69 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  iPending){.     
358d0 20 20 20 69 36 34 20 69 4f 66 66 3b 0a 20 20 20     i64 iOff;.   
358e0 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20       for(.      
358f0 20 20 20 20 69 4f 66 66 3d 69 50 65 6e 64 69 6e      iOff=iPendin
35900 67 3b 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  g; .          rc
35910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
35920 4f 66 66 3c 28 69 50 65 6e 64 69 6e 67 2b 6e 54  Off<(iPending+nT
35930 6f 50 61 67 65 53 69 7a 65 29 3b 20 0a 20 20 20  oPageSize); .   
35940 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
35950 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20  FromPageSize.   
35960 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
35970 20 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50    DbPage *pFromP
35980 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
35990 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20     Pgno iFrom = 
359a0 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53  (iOff/nFromPageS
359b0 69 7a 65 29 2b 31 3b 0a 20 20 0a 20 20 20 20 20  ize)+1;.  .     
359c0 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
359d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
359e0 45 28 70 42 74 46 72 6f 6d 29 20 7c 7c 20 69 46  E(pBtFrom) || iF
359f0 72 6f 6d 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b  rom>nFromPage ){
35a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
35a10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
35a20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20   }.  .          
35a30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35a40 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50  rGet(pBtFrom->pP
35a50 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46  ager, iFrom, &pF
35a60 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
35a70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35a90 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d       char *zFrom
35aa0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
35ab0 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61 67 65  etData(pFromPage
35ac0 29 3b 0a 20 20 09 20 20 72 63 20 3d 20 73 71 6c  );.  .  rc = sql
35ad0 69 74 65 33 4f 73 57 72 69 74 65 28 70 46 69 6c  ite3OsWrite(pFil
35ae0 65 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50  e, zFrom, nFromP
35af0 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 29 3b 0a  ageSize, iOff);.
35b00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
35b10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 46  te3PagerUnref(pF
35b20 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
35b30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
35b40 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
35b50 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
35b60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
35b70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35ba0 65 72 53 79 6e 63 28 70 42 74 54 6f 2d 3e 70 50  erSync(pBtTo->pP
35bb0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
35bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35be0 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d  rTruncate(pBtTo-
35bf0 3e 70 50 61 67 65 72 2c 20 6e 4e 65 77 50 61 67  >pPager, nNewPag
35c00 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
35c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35c20 29 7b 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e  ){.      pBtTo->
35c30 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
35c40 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
35c50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
35c60 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
35c70 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20  ck(pTo);.  }..  
35c80 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69  return rc;  .}.i
35c90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
35ca0 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70  opyFile(Btree *p
35cb0 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d  To, Btree *pFrom
35cc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
35cd0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
35ce0 28 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pTo);.  sqlite3
35cf0 42 74 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d  BtreeEnter(pFrom
35d00 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
35d10 6f 70 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72  opyFile(pTo, pFr
35d20 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  om);.  sqlite3Bt
35d30 72 65 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b  reeLeave(pFrom);
35d40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
35d50 65 61 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74  eave(pTo);.  ret
35d60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
35d70 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
35d80 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  _VACUUM */../*.*
35d90 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
35da0 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  o if a transacti
35db0 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
35dc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
35dd0 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65  eIsInTrans(Btree
35de0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
35df0 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  p==0 || sqlite3_
35e00 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
35e10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
35e20 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69  turn (p && (p->i
35e30 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
35e40 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ITE));.}../*.** 
35e50 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
35e60 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  if a statement t
35e70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
35e80 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
35e90 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d  ite3BtreeIsInStm
35ea0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  t(Btree *p){.  a
35eb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
35ec0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
35ed0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
35ee0 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e  >pBt && p->pBt->
35ef0 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  inStmt);.}../*.*
35f00 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
35f10 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72 20  o if a read (or 
35f20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
35f30 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
35f40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
35f50 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42  eIsInReadTrans(B
35f60 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
35f70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
35f80 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
35f90 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
35fa0 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
35fb0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29  ns!=TRANS_NONE))
35fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
35fd0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
35fe0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
35ff0 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
36000 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
36010 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65  * a single share
36020 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d  d-btree. The mem
36030 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20 63  ory is used by c
36040 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69  lient code for i
36050 74 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73  ts own.** purpos
36060 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c  es (for example,
36070 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68   to store a high
36080 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73  -level schema as
36090 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
360a0 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  * the shared-btr
360b0 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c  ee). The btree l
360c0 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66  ayer manages ref
360d0 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20  erence counting 
360e0 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  issues..**.** Th
360f0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
36100 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  s is called on a
36110 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e   shared-btree, n
36120 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d  Bytes bytes of m
36130 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c  emory.** are all
36140 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20  ocated, zeroed, 
36150 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20  and returned to 
36160 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20  the caller. For 
36170 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
36180 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79  .** call the nBy
36190 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  tes parameter is
361a0 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70   ignored and a p
361b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61  ointer to the sa
361c0 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65  me blob.** of me
361d0 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a  mory returned. .
361e0 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f 72  **.** Just befor
361f0 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  e the shared-btr
36200 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 68  ee is closed, th
36210 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73 65  e function passe
36220 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46 72  d as the .** xFr
36230 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e  ee argument when
36240 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
36250 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65 20  cation was made 
36260 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74 68  is invoked on th
36270 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 6c  e .** blob of al
36280 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 20  located memory. 
36290 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
362a0 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73 71  ould not call sq
362b0 6c 69 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a 20  lite3_free().** 
362c0 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74  on the memory, t
362d0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64  he btree layer d
362e0 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69  oes that..*/.voi
362f0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53  d *sqlite3BtreeS
36300 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20  chema(Btree *p, 
36310 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64  int nBytes, void
36320 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29  (*xFree)(void *)
36330 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
36340 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
36350 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
36360 28 70 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  (p);.  if( !pBt-
36370 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
36380 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73  pBt->pSchema = s
36390 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
363a0 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42  (nBytes);.    pB
363b0 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d  t->xFreeSchema =
363c0 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71   xFree;.  }.  sq
363d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
363e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  p);.  return pBt
363f0 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a  ->pSchema;.}../*
36400 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
36410 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20  if another user 
36420 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72  of the same shar
36430 65 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20  ed btree as the 
36440 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64  argument.** hand
36450 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  le holds an excl
36460 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
36470 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
36480 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
36490 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
364a0 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29  Locked(Btree *p)
364b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
364c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
364d0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
364e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
364f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
36500 3b 0a 20 20 72 63 20 3d 20 28 71 75 65 72 79 54  ;.  rc = (queryT
36510 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
36520 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
36530 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b  CK)!=SQLITE_OK);
36540 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
36550 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
36560 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  n rc;.}...#ifnde
36570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
36580 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
36590 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
365a0 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73  n the table whos
365b0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69  e root page is i
365c0 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63  Tab.  The.** loc
365d0 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63  k is a write loc
365e0 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b  k if isWritelock
365f0 20 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65   is true or a re
36600 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74  ad lock.** if it
36610 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e   is false..*/.in
36620 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  t sqlite3BtreeLo
36630 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
36640 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69  , int iTab, u8 i
36650 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69  sWriteLock){.  i
36660 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36670 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  K;.  if( p->shar
36680 61 62 6c 65 20 29 7b 0a 20 20 20 20 75 38 20 6c  able ){.    u8 l
36690 6f 63 6b 54 79 70 65 20 3d 20 52 45 41 44 5f 4c  ockType = READ_L
366a0 4f 43 4b 20 2b 20 69 73 57 72 69 74 65 4c 6f 63  OCK + isWriteLoc
366b0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 52  k;.    assert( R
366c0 45 41 44 5f 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54  EAD_LOCK+1==WRIT
366d0 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  E_LOCK );.    as
366e0 73 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63  sert( isWriteLoc
366f0 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c  k==0 || isWriteL
36700 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  ock==1 );.    sq
36710 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
36720 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 71 75 65  p);.    rc = que
36730 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
36740 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
36750 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36760 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
36770 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
36780 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
36790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
367a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
367b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
367c0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
367d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
367e0 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
367f0 41 72 67 75 6d 65 6e 74 20 70 43 73 72 20 6d 75  Argument pCsr mu
36800 73 74 20 62 65 20 61 20 63 75 72 73 6f 72 20 6f  st be a cursor o
36810 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
36820 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b  g on an .** INTK
36830 45 59 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  EY table current
36840 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ly pointing at a
36850 20 76 61 6c 69 64 20 74 61 62 6c 65 20 65 6e 74   valid table ent
36860 72 79 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ry. .** This fun
36870 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74  ction modifies t
36880 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 61  he data stored a
36890 73 20 70 61 72 74 20 6f 66 20 74 68 61 74 20 65  s part of that e
368a0 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68  ntry..** Only th
368b0 65 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d  e data content m
368c0 61 79 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66  ay only be modif
368d0 69 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  ied, it is not p
368e0 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68  ossible.** to ch
368f0 61 6e 67 65 20 74 68 65 20 6c 65 6e 67 74 68 20  ange the length 
36900 6f 66 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  of the data stor
36910 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
36920 65 33 42 74 72 65 65 50 75 74 44 61 74 61 28 42  e3BtreePutData(B
36930 74 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 75  tCursor *pCsr, u
36940 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
36950 6d 74 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20  mt, void *z){.  
36960 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
36970 6c 64 73 4d 75 74 65 78 28 70 43 73 72 29 20 29  ldsMutex(pCsr) )
36980 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36990 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
369a0 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Csr->pBtree->db-
369b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
369c0 65 72 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72  ert(pCsr->isIncr
369d0 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 69  blobHandle);.  i
369e0 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3e  f( pCsr->eState>
369f0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
36a00 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
36a10 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
36a20 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
36a30 20 20 20 72 65 74 75 72 6e 20 70 43 73 72 2d 3e     return pCsr->
36a40 73 6b 69 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  skip;.    }else{
36a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
36a60 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20  LITE_ABORT;.    
36a70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
36a80 6b 20 73 6f 6d 65 20 70 72 65 63 6f 6e 64 69 74  k some precondit
36a90 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20 20 20 28 61  ions: .  **   (a
36aa0 29 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  ) the cursor is 
36ab0 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
36ac0 2c 0a 20 20 2a 2a 20 20 20 28 62 29 20 74 68 65  ,.  **   (b) the
36ad0 72 65 20 69 73 20 6e 6f 20 72 65 61 64 2d 6c 6f  re is no read-lo
36ae0 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
36af0 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 20 61  being modified a
36b00 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 74 68  nd.  **   (c) th
36b10 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
36b20 61 74 20 61 20 76 61 6c 69 64 20 72 6f 77 20 6f  at a valid row o
36b30 66 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  f an intKey tabl
36b40 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  e..  */.  if( !p
36b50 43 73 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Csr->wrFlag ){. 
36b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36b70 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
36b80 20 61 73 73 65 72 74 28 20 21 70 43 73 72 2d 3e   assert( !pCsr->
36b90 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20  pBt->readOnly . 
36ba0 20 20 20 20 20 20 20 20 20 26 26 20 70 43 73 72           && pCsr
36bb0 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
36bc0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
36bd0 45 20 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  E );.  if( check
36be0 52 65 61 64 4c 6f 63 6b 73 28 70 43 73 72 2d 3e  ReadLocks(pCsr->
36bf0 70 42 74 72 65 65 2c 20 70 43 73 72 2d 3e 70 67  pBtree, pCsr->pg
36c00 6e 6f 52 6f 6f 74 2c 20 70 43 73 72 29 20 29 7b  noRoot, pCsr) ){
36c10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
36c20 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
36c30 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
36c40 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
36c50 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  d lock */.  }.  
36c60 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65  if( pCsr->eState
36c70 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
36c80 20 7c 7c 20 21 70 43 73 72 2d 3e 70 50 61 67 65   || !pCsr->pPage
36c90 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
36ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
36cb0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
36cc0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
36cd0 28 70 43 73 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCsr, offset, a
36ce0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
36cf0 61 72 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d  ar *)z, 0, 1);.}
36d00 0a 0a 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66  ../* .** Set a f
36d10 6c 61 67 20 6f 6e 20 74 68 69 73 20 63 75 72 73  lag on this curs
36d20 6f 72 20 74 6f 20 63 61 63 68 65 20 74 68 65 20  or to cache the 
36d30 6c 6f 63 61 74 69 6f 6e 73 20 6f 66 20 70 61 67  locations of pag
36d40 65 73 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  es from the .** 
36d50 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f  overflow list fo
36d60 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
36d70 77 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  w. This is used 
36d80 62 79 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  by cursors opene
36d90 64 0a 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65  d.** for increme
36da0 6e 74 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c  ntal blob IO onl
36db0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  y..**.** This fu
36dc0 6e 63 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c  nction sets a fl
36dd0 61 67 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74  ag only. The act
36de0 75 61 6c 20 70 61 67 65 20 6c 6f 63 61 74 69 6f  ual page locatio
36df0 6e 20 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72  n cache.** (stor
36e00 65 64 20 69 6e 20 42 74 43 75 72 73 6f 72 2e 61  ed in BtCursor.a
36e10 4f 76 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61  Overflow[]) is a
36e20 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 75 73 65  llocated and use
36e30 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  d by function.**
36e40 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
36e50 20 28 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e   (the worker fun
36e60 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65  ction for sqlite
36e70 33 42 74 72 65 65 44 61 74 61 28 29 20 61 6e 64  3BtreeData() and
36e80 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
36e90 50 75 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76  PutData())..*/.v
36ea0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
36eb0 43 61 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74  CacheOverflow(Bt
36ec0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
36ed0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
36ee0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
36ef0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36f00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
36f10 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
36f20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
36f30 73 65 72 74 28 21 70 43 75 72 2d 3e 69 73 49 6e  sert(!pCur->isIn
36f40 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20  crblobHandle);. 
36f50 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
36f60 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75  Overflow);.  pCu
36f70 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
36f80 64 6c 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69  dle = 1;.}.#endi
36f90 66 0a                                            f.