/ Hex Artifact Content
Login

Artifact 20d51e14297a249408d9cc4bea433e23a72ef125:


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 34 38 20 32 30 30 38 2f 30  c,v 1.448 2008/0
0190: 33 2f 32 39 20 31 36 3a 30 31 3a 30 34 20 64 72  3/29 16:01:04 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 3c 6e 4b 65 79 20 29 7b 0a 20  ellKey<nKey ){. 
1bc90 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
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 3e 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 2b 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 63  lse{.          c
1bcf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1bd00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1bd10 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62       int availab
1bd20 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  le;.        pCel
1bd30 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66  lKey = (void *)f
1bd40 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1bd50 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29  , &available, 0)
1bd60 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b  ;.        nCellK
1bd70 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ey = pCur->info.
1bd80 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  nKey;.        if
1bd90 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65  ( available>=nCe
1bda0 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  llKey ){.       
1bdb0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
1bdc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1bdd0 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1bde0 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20  ey, pUnKey);.   
1bdf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1be00 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
1be10 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1be20 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20   nCellKey );.   
1be30 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1be40 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
1be50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1be60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
1be70 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1be80 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
1be90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
1bea0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1beb0 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
1bec0 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70  llKey, (void *)p
1bed0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1bee0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1bef0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1bf00 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  (nCellKey, pCell
1bf10 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20  Key, pUnKey);.  
1bf20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1bf30 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
1bf40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1bf50 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1bf60 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
1bf70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bf80 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1bf90 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
1bfa0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
1bfb0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1bfc0 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1bfd0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bfe0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43          lwr = pC
1bff0 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20  ur->idx;.       
1c000 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
1c010 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c020 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1c030 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1c040 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30  pRes ) *pRes = 0
1c050 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1c060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c070 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1c080 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
1c090 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c0a0 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
1c0b0 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1c0c0 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65  >idx+1;.      }e
1c0d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
1c0e0 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a   = pCur->idx-1;.
1c0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c100 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
1c110 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1c120 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
1c130 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
1c150 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75  ur->idx = (lwr+u
1c160 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20  pr)/2;.    }.   
1c170 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
1c180 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
1c190 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1c1a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1c1b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1c1c0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
1c1d0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1c1e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1c1f0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1c200 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c210 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c220 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1c230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
1c240 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
1c250 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
1c260 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
1c270 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
1c280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c290 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1c2a0 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
1c2b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1c2c0 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1c2d0 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
1c2e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c2f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
1c300 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
1c310 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
1c320 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e   lwr;.    pCur->
1c330 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1c340 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1c350 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
1c360 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1c370 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
1c380 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
1c390 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c3a0 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
1c3b0 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1c3c0 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61     /* If we crea
1c3d0 74 65 64 20 6f 75 72 20 6f 77 6e 20 75 6e 70 61  ted our own unpa
1c3e0 63 6b 65 64 20 6b 65 79 20 61 74 20 74 68 65 20  cked key at the 
1c3f0 74 6f 70 20 6f 66 20 74 68 69 73 0a 20 20 20 20  top of this.    
1c400 2a 2a 20 70 72 6f 63 65 64 75 72 65 2c 20 74 68  ** procedure, th
1c410 65 6e 20 64 65 73 74 72 6f 79 20 74 68 61 74 20  en destroy that 
1c420 6b 65 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  key before retur
1c430 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ning. */.    sql
1c440 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1c450 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 55 6e  packedRecord(pUn
1c460 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
1c470 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1c480 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c490 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1c4a0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1c4b0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1c4c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1c4d0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1c4e0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1c4f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1c500 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1c510 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1c520 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1c530 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1c540 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1c550 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1c560 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1c570 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1c580 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1c590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c5a0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1c5b0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1c5c0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1c5d0 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1c5e0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1c5f0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1c600 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1c610 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1c620 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1c630 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1c640 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1c650 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1c660 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1c670 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1c680 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1c690 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1c6a0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1c6b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1c6c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1c6d0 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75   handle for a cu
1c6e0 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rsor..*/.sqlite3
1c6f0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   *sqlite3BtreeCu
1c700 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43  rsorDb(const BtC
1c710 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1c720 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1c730 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1c740 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1c750 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
1c760 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1c770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1c780 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
1c790 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1c7a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1c7b0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1c7c0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1c7d0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1c7e0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1c7f0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1c800 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1c810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1c820 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1c830 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1c840 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1c850 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
1c860 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
1c870 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1c880 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1c890 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1c8a0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1c8b0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c8c0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1c8d0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
1c8e0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1c8f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1c910 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1c920 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
1c930 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1c940 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 43  ->pPage;.  if( C
1c950 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1c960 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1c970 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1c980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c990 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1c9a0 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
1c9b0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1c9c0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1c9d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c9e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1c9f0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
1ca00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1ca10 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1ca20 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  t( pCur->idx<pPa
1ca30 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
1ca40 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70  pCur->idx++;.  p
1ca50 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ca60 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1ca70 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1ca80 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1ca90 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1caa0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1cab0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1cac0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1cad0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
1cae0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1caf0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
1cb00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1cb10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1cb20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1cb30 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
1cb40 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1cb50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1cb60 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
1cb70 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1cb80 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1cb90 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  e) ){.        *p
1cba0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1cbb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1cbc0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1cbd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1cbe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1cbf0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1cc00 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1cc10 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1cc20 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1cc30 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
1cc40 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1cc50 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
1cc60 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
1cc70 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1cc80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1cc90 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1cca0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1ccb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1ccc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ccd0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1cce0 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1ccf0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1cd00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1cd10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cd20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1cd30 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1cd40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
1cd50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1cd60 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
1cd70 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1cd80 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1cd90 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1cda0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1cdb0 72 63 20 3d 20 62 74 72 65 65 4e 65 78 74 28 70  rc = btreeNext(p
1cdc0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 72 65  Cur, pRes);.  re
1cdd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1cde0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
1cdf0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
1ce00 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
1ce10 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1ce20 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
1ce30 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
1ce40 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
1ce50 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
1ce60 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
1ce70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1ce80 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1ce90 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
1cea0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1ceb0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
1cec0 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 73 74 61 74  *pRes=1..*/.stat
1ced0 69 63 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  ic int btreePrev
1cee0 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
1cef0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1cf00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
1cf10 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67  o pgno;.  MemPag
1cf20 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1cf30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1cf40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1cf50 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
1cf60 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1cf70 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1cf80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cf90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1cfa0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61    }.  pCur->atLa
1cfb0 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55  st = 0;.  if( CU
1cfc0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1cfd0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1cfe0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1cff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d000 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
1d010 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20  r->skip<0 ){.   
1d020 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1d030 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1d040 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d050 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1d060 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70  ->skip = 0;..  p
1d070 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1d080 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
1d090 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1d0a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1d0b0 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  dx>=0 );.  if( !
1d0c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1d0d0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1d0e0 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  te( findCell(pPa
1d0f0 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29  ge, pCur->idx) )
1d100 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1d110 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1d120 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
1d130 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1d140 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1d150 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1d160 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
1d170 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
1d180 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20  r->idx==0 ){.   
1d190 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
1d1a0 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
1d1b0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
1d1c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1d1d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1d1e0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1d1f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d210 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d220 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1d230 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
1d240 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1d250 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  age;.    }.    p
1d260 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20  Cur->idx--;.    
1d270 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1d280 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1d290 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1d2a0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
1d2b0 61 66 44 61 74 61 20 26 26 20 21 70 50 61 67 65  afData && !pPage
1d2c0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1d2d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1d2e0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
1d2f0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
1d300 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d310 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1d320 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
1d330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
1d340 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
1d350 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
1d360 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1d370 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
1d380 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1d390 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1d3a0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 50 72 65  .  rc = btreePre
1d3b0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1d3c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d3d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1d3e0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1d3f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1d400 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1d410 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1d420 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1d430 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1d440 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d450 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1d460 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1d470 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1d480 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1d490 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1d4a0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1d4b0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1d4c0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1d4d0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1d4e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d4f0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1d500 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1d510 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1d520 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1d530 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1d540 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1d550 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1d560 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1d570 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1d580 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1d590 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1d5a0 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1d5b0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1d5c0 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1d5d0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1d5e0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1d5f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1d600 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1d610 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1d620 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1d630 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1d640 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1d650 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1d660 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1d670 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1d680 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1d690 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1d6a0 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1d6b0 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1d6c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d6d0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1d6e0 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1d6f0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1d700 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1d710 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1d720 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1d730 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1d740 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1d750 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1d760 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1d770 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1d780 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1d790 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1d7a0 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1d7b0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1d7c0 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1d7d0 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1d7e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1d7f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d800 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1d810 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1d820 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1d830 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1d840 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1d850 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1d860 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1d870 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1d880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1d890 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1d8a0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1d8b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d8c0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1d8d0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1d8e0 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1d8f0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1d900 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1d910 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  unk = 0;..  asse
1d920 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d930 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d940 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
1d950 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1d960 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1d970 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1d980 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1d990 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1d9a0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1d9b0 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1d9c0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1d9d0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1d9e0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1d9f0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1da00 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1da10 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1da20 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1da30 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1da40 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1da50 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1da60 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1da70 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1da80 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1da90 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1daa0 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1dab0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1dac0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1dad0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1dae0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1daf0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1db00 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1db10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1db20 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1db30 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 73 71 6c  t && nearby<=sql
1db40 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1db50 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
1db60 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
1db70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1db80 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
1db90 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1dba0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
1dbb0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1dbc0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
1dbd0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
1dbe0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1dbf0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
1dc00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1dc10 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1dc20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
1dc30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dc40 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
1dc50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1dc60 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
1dc70 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
1dc80 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
1dc90 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
1dca0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
1dcb0 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
1dcc0 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
1dcd0 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
1dce0 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
1dcf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dd00 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1dd10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1dd20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1dd30 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
1dd40 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1dd50 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
1dd60 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
1dd70 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
1dd80 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
1dd90 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
1dda0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
1ddb0 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
1ddc0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
1ddd0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1dde0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
1ddf0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
1de00 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
1de10 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
1de20 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
1de30 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
1de40 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
1de50 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
1de60 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1de70 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1de80 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
1de90 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
1dea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1deb0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1dec0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1ded0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
1dee0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1def0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1df00 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
1df10 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
1df20 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1df30 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
1df40 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1df50 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1df60 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
1df70 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1df80 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
1df90 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
1dfa0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
1dfb0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1dfc0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
1dfd0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
1dfe0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
1dff0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
1e000 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
1e010 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
1e020 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
1e030 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
1e040 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
1e050 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
1e060 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
1e070 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
1e080 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e090 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1e0a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e0b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e0c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e0d0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
1e0f0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
1e100 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1e110 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1e120 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1e130 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1e140 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
1e150 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
1e160 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1e170 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1e180 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1e190 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1e1a0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1e1b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1e1c0 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
1e1d0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
1e1e0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
1e1f0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
1e200 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
1e210 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1e220 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e230 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e240 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1e250 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
1e260 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e270 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1e280 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1e290 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
1e2a0 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
1e2b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
1e2c0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
1e2d0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
1e2e0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
1e2f0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
1e300 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
1e310 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
1e320 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
1e330 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e340 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1e350 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
1e360 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
1e370 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
1e380 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
1e390 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e3a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e3b0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1e3c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1e3d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1e3e0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e3f0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1e400 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
1e410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e420 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
1e430 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1e440 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
1e450 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
1e460 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
1e470 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e480 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1e490 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
1e4a0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1e4b0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1e4c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e4e0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
1e4f0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
1e500 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1e510 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
1e520 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
1e530 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
1e540 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
1e550 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
1e560 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
1e570 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
1e580 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
1e590 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e5a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
1e5b0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
1e5c0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
1e5d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1e5e0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
1e5f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1e600 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1e610 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
1e620 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
1e630 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e650 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1e660 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e670 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1e680 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e690 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e6a0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
1e6b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e6c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e6d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e6e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
1e6f0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
1e700 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e710 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e730 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1e740 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1e750 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1e760 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1e770 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
1e780 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
1e790 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
1e7a0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1e7b0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
1e7c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
1e7d0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
1e7e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e7f0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
1e800 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
1e810 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1e820 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1e830 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e840 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
1e850 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e860 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1e870 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e880 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
1e890 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e8a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
1e8c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e8d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1e8e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1e8f0 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
1e900 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1e910 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
1e920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e930 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
1e940 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
1e950 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1e960 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
1e970 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
1e980 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
1e990 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
1e9a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1e9b0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
1e9c0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
1e9d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
1e9e0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
1e9f0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
1ea00 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ea10 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
1ea20 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
1ea30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ea40 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1ea50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1ea60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1ea70 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1ea80 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1ea90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1eaa0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
1eab0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
1eac0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
1ead0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1eae0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
1eaf0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
1eb00 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
1eb10 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
1eb20 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
1eb30 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
1eb40 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
1eb50 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
1eb60 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
1eb70 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
1eb80 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
1eb90 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
1eba0 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
1ebb0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
1ebc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1ebd0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
1ebe0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
1ebf0 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
1ec00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1ec10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ec20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1ec30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1ec40 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
1ec50 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1ec60 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
1ec70 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
1ec80 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
1ec90 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
1eca0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1ecb0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1ecc0 69 66 28 20 2a 70 50 67 6e 6f 3e 73 71 6c 69 74  if( *pPgno>sqlit
1ecd0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1ece0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
1ecf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1ed00 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
1ed10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
1ed20 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1ed30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1ed40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1ed50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ed60 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1ed70 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
1ed80 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
1ed90 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
1eda0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
1edb0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
1edc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1edd0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
1ede0 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
1edf0 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
1ee00 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
1ee10 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
1ee20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
1ee30 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1ee40 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
1ee50 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1ee60 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
1ee70 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
1ee80 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1ee90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1eea0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
1eeb0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
1eec0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1eed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1eee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1eef0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1ef00 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d  lback((*ppPage)-
1ef10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1ef20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ef30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1ef40 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1ef50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1ef60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ef70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ef80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1ef90 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1efa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1efb0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1efc0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1efd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1efe0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1eff0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1f000 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1f010 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
1f020 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
1f030 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1f040 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
1f050 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
1f060 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
1f070 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
1f080 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
1f090 69 6c 65 20 2a 2f 0a 20 20 20 20 2a 70 50 67 6e  ile */.    *pPgn
1f0a0 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  o = sqlite3Pager
1f0b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1f0c0 50 61 67 65 72 29 20 2b 20 31 3b 0a 0a 23 69 66  Pager) + 1;..#if
1f0d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f0e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1f0f0 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1f100 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
1f110 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61  ncr-vacuum has a
1f120 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74 68 69  lready run withi
1f130 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
1f140 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20  on. So the.     
1f150 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f   ** page to allo
1f160 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d  cate is not from
1f170 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e   the physical en
1f180 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62  d of the file, b
1f190 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70  ut.      ** at p
1f1a0 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20  Bt->nTrunc. .   
1f1b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67     */.      *pPg
1f1c0 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  no = pBt->nTrunc
1f1d0 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  +1;.      if( *p
1f1e0 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
1f1f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1f200 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29          (*pPgno)
1f210 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1f220 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  }.    if( pBt->a
1f230 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
1f240 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1f250 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
1f260 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
1f270 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
1f280 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
1f290 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
1f2a0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
1f2b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1f2c0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
1f2d0 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
1f2e0 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
1f2f0 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
1f300 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
1f310 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
1f320 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
1f330 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
1f340 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1f350 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1f360 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
1f370 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
1f380 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
1f390 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1f3a0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1f3b0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
1f3c0 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
1f3d0 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d       if( *pPgno=
1f3e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f3f0 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67  GE(pBt) ){ (*pPg
1f400 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20  no)++; }.    }. 
1f410 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1f420 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  nc ){.      pBt-
1f430 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f  >nTrunc = *pPgno
1f440 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1f450 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1f460 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1f470 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1f480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1f490 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1f4a0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1f4b0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1f4c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f4d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f4e0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1f4f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f510 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1f520 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1f530 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
1f540 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1f550 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1f560 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1f570 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1f580 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1f590 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1f5a0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
1f5b0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
1f5c0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
1f5d0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1f5e0 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
1f5f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
1f600 61 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  a page of the da
1f610 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74  tabase file to t
1f620 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
1f630 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1f640 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61  nref() is NOT ca
1f650 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a  lled for pPage..
1f660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
1f670 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
1f680 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  pPage){.  BtShar
1f690 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1f6a0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1f6b0 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1f6c0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c  Page1;.  int rc,
1f6d0 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65   n, k;..  /* Pre
1f6e0 70 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f  pare the page fo
1f6f0 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61  r freeing */.  a
1f700 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f710 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1f720 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1f730 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1f740 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61  >pgno>1 );.  pPa
1f750 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
1f760 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1f770 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
1f780 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
1f790 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  = 0;..  /* Incre
1f7a0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
1f7b0 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
1f7c0 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
1f7d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f7e0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1f7f0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1f800 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74  rn rc;.  n = get
1f810 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1f820 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
1f830 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1f840 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a  Data[36], n+1);.
1f850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
1f860 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
1f870 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1f880 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
1f890 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1f8a0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
1f8b0 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
1f8c0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
1f8d0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
1f8e0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
1f8f0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1f900 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1f910 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1f920 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1f930 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  rc;.  memset(pPa
1f940 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
1f950 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
1f960 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ze);.#endif..#if
1f970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f980 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1f990 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1f9a0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
1f9b0 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
1f9c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
1f9d0 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
1f9e0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1f9f0 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
1fa00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
1fa10 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1fa20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
1fa30 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67  t(pBt, pPage->pg
1fa40 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  no, PTRMAP_FREEP
1fa50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
1fa60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1fa70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1fa80 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  f( n==0 ){.    /
1fa90 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69  * This is the fi
1faa0 72 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f  rst free page */
1fab0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1fac0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1fad0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1fae0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1faf0 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   rc;.    memset(
1fb00 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
1fb10 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74   8);.    put4byt
1fb20 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1fb30 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1fb40 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22  o);.    TRACE(("
1fb50 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69  FREE-PAGE: %d fi
1fb60 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70  rst\n", pPage->p
1fb70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
1fb80 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65      /* Other fre
1fb90 65 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  e pages already 
1fba0 65 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20  exist.  Retrive 
1fbb0 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
1fbc0 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  page.    ** of t
1fbd0 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
1fbe0 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e  find out how man
1fbf0 79 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e  y leaves it has.
1fc00 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
1fc10 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20  *pTrunk;.    rc 
1fc20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1fc30 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  tPage(pBt, get4b
1fc40 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1fc50 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b  ta[32]), &pTrunk
1fc60 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1fc70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fc80 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
1fc90 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
1fca0 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42  );.    if( k>=pB
1fcb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
1fcc0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
1fcd0 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c  The trunk is ful
1fce0 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67  l.  Turn the pag
1fcf0 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e  e being freed in
1fd00 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a  to a new.      *
1fd10 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74  * trunk page wit
1fd20 68 20 6e 6f 20 6c 65 61 76 65 73 2e 20 2a 2f 0a  h no leaves. */.
1fd30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fd40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1fd50 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1fd60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fd70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fd80 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
1fd90 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e  >aData, pTrunk->
1fda0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  pgno);.        p
1fdb0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1fdc0 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
1fdd0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1fde0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1fdf0 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ], pPage->pgno);
1fe00 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
1fe10 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
1fe20 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
1fe30 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20  placing %d\n",. 
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1fe50 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75  Page->pgno, pTru
1fe60 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
1fe70 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1fe80 28 20 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  ( k<0 ){.      r
1fe90 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1fea0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
1feb0 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1fec0 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61 67 65  newly freed page
1fed0 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68   as a leaf on th
1fee0 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20  e current trunk 
1fef0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1ff00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ff10 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1ff20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1ff30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ff40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ff50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
1ff60 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70   k+1);.        p
1ff70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
1ff80 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70  >aData[8+k*4], p
1ff90 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66  Page->pgno);.#if
1ffa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  ndef SQLITE_SECU
1ffb0 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  RE_DELETE.      
1ffc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
1ffd0 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
1ffe0 44 62 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  DbPage);.#endif.
1fff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
20000 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
20010 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
20020 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
20030 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
20040 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
20050 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20060 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  Trunk);.  }.  re
20070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20080 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
20090 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
200a0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
200b0 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
200c0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
200d0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
200e0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
200f0 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
20100 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
20110 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
20120 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
20130 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
20140 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
20150 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69    int ovflPageSi
20160 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
20170 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20180 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
20190 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
201a0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
201b0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
201c0 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
201d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
201e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
201f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
20200 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
20210 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
20220 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
20230 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
20240 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
20250 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
20260 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  w]);.  ovflPageS
20270 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
20280 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
20290 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
202a0 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
202b0 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
202c0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
202d0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
202e0 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
202f0 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
20300 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
20310 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a  MemPage *pOvfl;.
20320 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
20330 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  ==0 || ovflPgno>
20340 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
20350 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
20360 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
20370 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20380 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
20390 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
203a0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
203b0 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28  lPgno, &pOvfl, (
203c0 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66  nOvfl==0)?0:&ovf
203d0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
203e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
203f0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
20400 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71  e(pOvfl);.    sq
20410 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20420 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
20430 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20440 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
20450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
20470 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
20480 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
20490 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
204a0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
204b0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
204c0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
204d0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
204e0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
204f0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
20500 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
20510 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
20520 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
20530 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
20540 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
20550 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
20560 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
20570 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
20580 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
20590 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
205a0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
205b0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
205c0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
205d0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
205e0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
205f0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
20600 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
20610 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
20620 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
20630 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
20640 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
20650 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
20660 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
20670 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
20680 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
206a0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
206b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
206c0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
206d0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
206e0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
206f0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
20700 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
20710 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
20720 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
20730 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
20740 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
20750 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
20760 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
20770 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20780 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
20790 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
207a0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
207b0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207d0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
207e0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
207f0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
20800 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
20810 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
20820 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
20830 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
20840 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
20850 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
20860 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
20870 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
20880 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20890 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
208a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
208b0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
208c0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
208d0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
208e0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
208f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20900 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
20910 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
20920 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
20930 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
20940 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
20950 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
20960 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
20970 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
20980 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
20990 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
209a0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
209b0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
209c0 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
209d0 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
209e0 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
209f0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
20a00 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
20a10 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
20a20 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  y);.  sqlite3Btr
20a30 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
20a40 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
20a50 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
20a60 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
20a70 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
20a80 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
20a90 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
20aa0 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61  nfo.nData==nData
20ab0 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f  +nZero );.  .  /
20ac0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
20ad0 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
20ae0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
20af0 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
20b00 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
20b10 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
20b20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
20b30 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
20b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
20b50 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
20b60 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
20b70 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a     nSrc = nKey;.
20b80 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
20b90 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
20ba0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
20bb0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
20bc0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
20bd0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
20be0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
20bf0 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
20c00 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
20c10 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
20c20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t==0 ){.      in
20c30 74 20 69 73 45 78 61 63 74 20 3d 20 30 3b 0a 23  t isExact = 0;.#
20c40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20c50 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20c60 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
20c70 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
20c80 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
20c90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
20ca0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
20cb0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
20cc0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
20cd0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
20ce0 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
20cf0 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
20d00 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
20d10 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
20d20 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
20d30 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20d40 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
20d50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
20d60 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20  gnoOvfl>1 ){.   
20d70 20 20 20 20 20 20 20 2f 2a 20 69 73 45 78 61 63         /* isExac
20d80 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20  t = 1; */.      
20d90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
20da0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
20db0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
20dc0 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
20dd0 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
20de0 2c 20 69 73 45 78 61 63 74 29 3b 0a 23 69 66 6e  , isExact);.#ifn
20df0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20e00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
20e10 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
20e20 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
20e30 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
20e40 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
20e50 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
20e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
20e70 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
20e80 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
20e90 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
20ea0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
20eb0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
20ec0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20ed0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
20ee0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
20ef0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
20f00 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
20f10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
20f20 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
20f30 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
20f40 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
20f50 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
20f60 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
20f70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
20f80 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
20f90 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
20fa0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
20fb0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
20fc0 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
20fd0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
20fe0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
20ff0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
21000 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
21010 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
21020 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
21030 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
21040 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
21050 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
21060 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
21070 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
21080 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
21090 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
210a0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
210b0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
210c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
210d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
210e0 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
210f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21100 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
21110 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
21120 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
21130 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
21140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21150 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
21160 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
21170 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
21180 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
21190 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
211a0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
211b0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
211c0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
211d0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
211e0 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
211f0 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
21200 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
21210 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
21220 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
21230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
21240 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
21250 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
21260 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  n = spaceLeft;. 
21270 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
21280 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
21290 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
212a0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
212b0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
212c0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
212d0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
212e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
212f0 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
21300 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
21310 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
21320 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
21330 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
21340 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
21350 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
21360 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
21370 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
21380 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
21390 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
213a0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
213b0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
213c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
213d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
213e0 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  the MemPage.pPar
213f0 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74  ent pointer on t
21400 68 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75  he page whose nu
21410 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e  mber is.** given
21420 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
21430 72 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  rgument so that 
21440 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
21450 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69  holds the.** poi
21460 6e 74 65 72 20 69 6e 20 74 68 65 20 74 68 69 72  nter in the thir
21470 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
21480 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65  tatic int repare
21490 6e 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20  ntPage(BtShared 
214a0 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pBt, Pgno pgno,
214b0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
214c0 72 65 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a  rent, int idx){.
214d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73    MemPage *pThis
214e0 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
214f0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
21500 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21510 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
21520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
21530 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
21540 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
21550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21560 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
21570 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62  ager!=0 );.  pDb
21580 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
21590 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
215a0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
215b0 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
215c0 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50     pThis = (MemP
215d0 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
215e0 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
215f0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68  ge);.    if( pTh
21600 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  is->isInit ){.  
21610 20 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69      assert( pThi
21620 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  s->aData==sqlite
21630 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
21640 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
21650 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
21660 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29  nt!=pNewParent )
21670 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
21680 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73  his->pParent ) s
21690 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
216a0 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d  (pThis->pParent-
216b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
216c0 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e     pThis->pParen
216d0 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a  t = pNewParent;.
216e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
216f0 61 67 65 72 52 65 66 28 70 4e 65 77 50 61 72 65  agerRef(pNewPare
21700 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
21710 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69      }.      pThi
21720 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69  s->idxParent = i
21730 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dx;.    }.    sq
21740 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21750 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23  pDbPage);.  }..#
21760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21770 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21780 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
21790 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72  uum ){.    retur
217a0 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  n ptrmapPut(pBt,
217b0 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
217c0 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d  REE, pNewParent-
217d0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64  >pgno);.  }.#end
217e0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
217f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
21800 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61  * Change the pPa
21810 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  rent pointer of 
21820 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
21830 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62  pPage to point b
21840 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e  ack.** to pPage.
21850 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
21860 77 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79  words, for every
21870 20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c   child of pPage,
21880 20 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74   invoke reparent
21890 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b  Page().** to mak
218a0 65 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68  e sure that each
218b0 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61   child knows tha
218c0 74 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70  t pPage is its p
218d0 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  arent..**.** Thi
218e0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
218f0 61 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20  alled after you 
21900 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67  memcpy() one pag
21910 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65  e into.** anothe
21920 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
21930 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
21940 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ges(MemPage *pPa
21950 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ge){.  int i;.  
21960 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21970 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
21980 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21990 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
219a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
219b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
219c0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
219d0 65 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e  e->leaf ) return
219e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66   SQLITE_OK;..  f
219f0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
21a00 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
21a10 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
21a20 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
21a30 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  ;.    rc = repar
21a40 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
21a50 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
21a60 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
21a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
21a90 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50    rc = reparentP
21aa0 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
21ab0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
21ac0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
21ad0 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20  +8]), .         
21ae0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
21af0 2c 20 69 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  , i);.  pPage->i
21b00 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72  dxShift = 0;.  r
21b10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21b20 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
21b30 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
21b40 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
21b50 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
21b60 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
21b70 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
21b80 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
21b90 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
21ba0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
21bb0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
21bc0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
21bd0 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
21be0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
21bf0 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
21c00 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
21c10 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
21c20 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
21c30 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
21c40 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
21c50 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
21c60 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
21c70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
21c80 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
21c90 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
21ca0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21cb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
21cc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
21cd0 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
21ce0 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
21cf0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
21d00 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
21d10 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
21d20 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
21d30 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
21d40 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
21d50 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
21d60 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
21d70 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
21d80 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
21d90 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
21da0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
21db0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21dc0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
21dd0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
21de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
21df0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21e00 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
21e10 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
21e20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
21e30 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
21e40 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
21e50 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
21e60 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
21e70 61 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26  assert( pc>10 &&
21e80 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70   pc+sz<=pPage->p
21e90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
21ea0 3b 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50  ;.  freeSpace(pP
21eb0 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
21ec0 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
21ed0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
21ee0 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
21ef0 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
21f00 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
21f10 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
21f20 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
21f30 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
21f40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
21f50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
21f60 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
21f70 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  = 2;.  pPage->id
21f80 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  xShift = 1;.}../
21f90 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
21fa0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
21fb0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
21fc0 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
21fd0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
21fe0 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
21ff0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
22000 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
22010 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
22020 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
22030 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
22040 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
22050 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
22060 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22070 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
22080 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
22090 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
220a0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
220b0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
220c0 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66  * in pPage->aOvf
220d0 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
220e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
220f0 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
22100 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
22110 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
22120 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
22130 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
22140 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
22150 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
22160 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
22170 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
22180 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
22190 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
221a0 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
221b0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
221c0 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
221d0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
221e0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
221f0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
22200 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
22210 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
22220 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
22230 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
22240 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
22250 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
22260 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
22270 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
22280 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
22290 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
222a0 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id)..*/.static i
222b0 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  nt insertCell(. 
222c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
222d0 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
222e0 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
222f0 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
22300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22310 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
22320 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
22330 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
22340 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
22350 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
22360 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
22370 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
22380 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
22390 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
223a0 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
223b0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
223c0 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
223d0 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
223e0 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20  d */.  u8 nSkip 
223f0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
22400 6f 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72  ot write the fir
22410 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
22420 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b  f the cell */.){
22430 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
22440 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
22450 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
22460 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
22470 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
22480 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22490 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
224a0 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
224b0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
224c0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
224d0 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20   cell in data[] 
224e0 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
224f0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22500 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
22510 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
22520 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
22530 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
22540 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
22550 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
22560 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
22570 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
22580 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  hdr;          /*
22590 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74   Offset into dat
225a0 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20  a[] of the page 
225b0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
225c0 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
225d0 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
225e0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
225f0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
22600 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
22610 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
22620 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
22630 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
22640 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
22650 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
22660 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
22670 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73   data[] */..  as
22680 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
22690 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
226a0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
226b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
226c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
226d0 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
226e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
226f0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
22700 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
22710 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
22720 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
22730 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
22740 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
22750 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
22760 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
22770 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
22780 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
22790 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
227a0 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
227b0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
227c0 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50  ert( j<sizeof(pP
227d0 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
227e0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
227f0 30 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  0]) );.    pPage
22800 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
22810 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
22820 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
22830 78 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65  x = i;.    pPage
22840 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
22850 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
22860 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
22870 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
22880 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
22890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
228a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
228b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
228c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
228d0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
228e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
228f0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
22900 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
22910 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
22920 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
22930 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
22940 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
22950 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
22960 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
22970 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
22980 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
22990 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
229a0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
229b0 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
229c0 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72   - sz ){.      r
229d0 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
229e0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
229f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22a00 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
22a10 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32        top = get2
22a20 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
22a30 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ]);.      assert
22a40 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f  ( end + sz <= to
22a50 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  p );.    }.    i
22a60 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  dx = allocateSpa
22a70 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20  ce(pPage, sz);. 
22a80 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 30     assert( idx>0
22a90 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22aa0 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28  end <= get2byte(
22ab0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
22ac0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
22ad0 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
22ae0 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20  nFree -= 2;.    
22af0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
22b00 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e  +nSkip], pCell+n
22b10 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
22b20 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32  .    for(j=end-2
22b30 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20  , ptr=&data[j]; 
22b40 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72  j>ins; j-=2, ptr
22b50 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b  -=2){.      ptr[
22b60 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20  0] = ptr[-2];.  
22b70 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
22b80 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [-1];.    }.    
22b90 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
22ba0 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
22bb0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
22bc0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
22bd0 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
22be0 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69  idxShift = 1;.#i
22bf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22c00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
22c10 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
22c20 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
22c30 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
22c40 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
22c50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
22c60 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
22c70 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
22c80 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
22c90 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
22ca0 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
22cb0 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
22cc0 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  .      CellInfo 
22cd0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69  info;.      sqli
22ce0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
22cf0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
22d00 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
22d10 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e   assert( (info.n
22d20 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
22d30 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
22d40 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  )==info.nPayload
22d50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
22d60 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
22d70 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
22d80 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
22d90 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  al ){.        Pg
22da0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
22db0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
22dc0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
22dd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
22de0 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
22df0 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52  t, pgnoOvfl, PTR
22e00 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
22e10 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
22e20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
22e30 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
22e40 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
22e50 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
22e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
22e80 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
22e90 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
22ea0 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
22eb0 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
22ec0 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
22ed0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
22ee0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
22ef0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
22f00 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
22f10 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
22f20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
22f30 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
22f40 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
22f50 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
22f60 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
22f70 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
22f80 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
22f90 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22fa0 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
22fb0 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65   */.  u16 *aSize
22fc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
22fd0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
22fe0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
22ff0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
23000 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
23010 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f   totalSize;    /
23020 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
23030 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69  all cells */.  i
23040 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
23050 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67   /* Index of pag
23060 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
23070 74 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20  t cellptr;      
23080 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
23090 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
230a0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
230b0 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
230c0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
230d0 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ody */.  u8 *dat
230e0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  a;         /* Da
230f0 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ta for the page 
23100 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
23110 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
23120 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
23130 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23140 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
23150 74 65 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53  tex) );.  totalS
23160 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ize = 0;.  for(i
23170 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
23180 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65  ){.    totalSize
23190 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
231a0 7d 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61  }.  assert( tota
231b0 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70  lSize+2*nCell<=p
231c0 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20  Page->nFree );. 
231d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
231e0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65  nCell==0 );.  ce
231f0 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63  llptr = pPage->c
23200 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74  ellOffset;.  dat
23210 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
23220 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
23230 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75  >hdrOffset;.  pu
23240 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
23250 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69  +3], nCell);.  i
23260 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  f( nCell ){.    
23270 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63  cellbody = alloc
23280 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
23290 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20  totalSize);.    
232a0 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
232b0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
232c0 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e  ( pPage->nFree >
232d0 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  = 2*nCell );.   
232e0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
232f0 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f   2*nCell;.    fo
23300 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
23310 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32  i++){.      put2
23320 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70  byte(&data[cellp
23330 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  tr], cellbody);.
23340 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
23350 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
23360 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69  Cell[i], aSize[i
23370 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74  ]);.      cellpt
23380 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65  r += 2;.      ce
23390 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b  llbody += aSize[
233a0 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  i];.    }.    as
233b0 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d  sert( cellbody==
233c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
233d0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20  leSize );.  }.  
233e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e  pPage->nCell = n
233f0 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
23400 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
23410 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
23420 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
23430 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
23440 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
23450 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
23460 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
23470 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
23480 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
23490 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
234a0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
234b0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
234c0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
234d0 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
234e0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
234f0 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
23500 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
23510 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
23520 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
23530 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
23540 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
23550 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
23560 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
23570 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
23580 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
23590 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
235a0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
235b0 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
235c0 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
235d0 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
235e0 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
235f0 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
23600 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
23610 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
23620 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
23630 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
23640 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
23650 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
23660 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
23670 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23680 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
23690 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
236a0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
236b0 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
236c0 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
236d0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
236e0 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20   balance */../* 
236f0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
23700 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
23710 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a  balance(MemPage*
23720 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66  , int);..#ifndef
23730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
23740 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
23750 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
23760 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
23770 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
23780 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
23790 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
237a0 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
237b0 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
237c0 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
237d0 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
237e0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
237f0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
23800 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
23810 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
23820 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
23830 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
23840 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  ng balance the 3
23850 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
23860 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
23870 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
23880 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
23890 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
238a0 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
238b0 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
238c0 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
238d0 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
238e0 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
238f0 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
23900 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
23910 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
23920 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
23930 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
23940 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
23950 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
23960 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
23970 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
23980 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
23990 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
239a0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
239b0 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
239c0 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
239d0 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
239e0 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
239f0 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
23a00 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
23a10 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
23a20 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
23a30 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
23a40 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
23a50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
23a60 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
23a70 67 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61  ge *pPage, MemPa
23a80 67 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20  ge *pParent){.  
23a90 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
23aa0 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20  e *pNew;.  Pgno 
23ab0 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70  pgnoNew;.  u8 *p
23ac0 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65  Cell;.  u16 szCe
23ad0 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  ll;.  CellInfo i
23ae0 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20  nfo;.  BtShared 
23af0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
23b00 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49  t;.  int parentI
23b10 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43  dx = pParent->nC
23b20 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e  ell;   /* pParen
23b30 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  t new divider ce
23b40 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
23b50 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20  t parentSize;   
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64  /* Size of new d
23b80 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
23b90 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36   u8 parentCell[6
23ba0 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
23bb0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23bc0 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
23bd0 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  cell */..  asser
23be0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23bf0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
23c00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
23c10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
23c20 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68   page. Insert th
23c30 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
23c40 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20  from pPage.  ** 
23c50 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  into it. Then re
23c60 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  move the overflo
23c70 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  w cell from pPag
23c80 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  e..  */.  rc = a
23c90 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
23ca0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
23cb0 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  noNew, 0, 0);.  
23cc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23cd0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
23ce0 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20  rc;.  }.  pCell 
23cf0 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
23d00 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c  ].pCell;.  szCel
23d10 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
23d20 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
23d30 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
23d40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29  pPage->aData[0])
23d50 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ;.  assemblePage
23d60 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
23d70 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50  , &szCell);.  pP
23d80 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
23d90 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   0;..  /* Set th
23da0 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
23db0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
23dc0 70 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e  page to pParent.
23dd0 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72   */.  pNew->pPar
23de0 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
23df0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
23e00 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
23e10 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20  e);..  /* pPage 
23e20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
23e30 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
23e40 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20  pParent. Change 
23e50 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61  this.  ** so tha
23e60 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
23e70 64 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67  d is the new pag
23e80 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76  e allocated abov
23e90 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65  e and.  ** pPage
23ea0 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d   is the next-to-
23eb0 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20  right child. .  
23ec0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
23ed0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
23ee0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
23ef0 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  l(pPage, pPage->
23f00 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69  nCell-1);.  sqli
23f10 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
23f20 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
23f30 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20  l, &info);.  rc 
23f40 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
23f50 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c  rent, parentCell
23f60 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20  , 0, info.nKey, 
23f70 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74  0, 0, 0, &parent
23f80 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
23f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
23fb0 0a 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e  .  assert( paren
23fc0 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63  tSize<64 );.  rc
23fd0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
23fe0 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78  arent, parentIdx
23ff0 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61  , parentCell, pa
24000 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b  rentSize, 0, 4);
24010 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
24020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
24030 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74  rn rc;.  }.  put
24040 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
24050 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
24060 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
24070 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62  ->pgno);.  put4b
24080 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
24090 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
240a0 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
240b0 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ew);..#ifndef SQ
240c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
240d0 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69  CUUM.  /* If thi
240e0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
240f0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
24100 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
24110 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65   map.  ** with e
24120 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
24130 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
24140 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
24150 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  e .  ** cell on 
24160 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
24170 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
24180 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
24190 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
241a0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
241b0 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
241c0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
241d0 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  nt->pgno);.    i
241e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
241f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
24200 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65  trmapPutOvfl(pNe
24210 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w, 0);.    }.   
24220 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
24240 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
24250 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24260 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
24270 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
24280 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
24290 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64  the new page and
242a0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
242b0 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69  ent page,.  ** i
242c0 6e 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64  n case the divid
242d0 65 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  er cell inserted
242e0 20 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65   caused it to be
242f0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20  come overfull.. 
24300 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67   */.  releasePag
24310 65 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  e(pNew);.  retur
24320 6e 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e  n balance(pParen
24330 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  t, 0);.}.#endif 
24340 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
24350 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
24360 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
24370 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
24380 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20   Cells on pPage 
24390 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73  and up to NN*2 s
243a0 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50  iblings.** of pP
243b0 61 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20  age so that all 
243c0 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74  pages have about
243d0 20 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74   the same amount
243e0 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a   of free space..
243f0 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69  ** Usually NN si
24400 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72  blings on either
24410 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69   side of pPage i
24420 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  s used in the ba
24430 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75  lancing,.** thou
24440 67 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73  gh more siblings
24450 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
24460 20 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61   one side if pPa
24470 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  ge is the first.
24480 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  ** or last child
24490 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
244a0 20 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65   If pPage has fe
244b0 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69  wer than 2*NN si
244c0 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74  blings.** (somet
244d0 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
244e0 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50  nly happen if pP
244f0 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20  age is the root 
24500 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68  page or a .** ch
24510 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65  ild of root) the
24520 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
24530 73 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69  siblings partici
24540 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
24550 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
24560 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
24570 6e 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67  ngs of pPage mig
24580 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
24590 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
245a0 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e  one or.** two in
245b0 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65   an effort to ke
245c0 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20  ep pages nearly 
245d0 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65  full but not ove
245e0 72 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74  r full. The root
245f0 20 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63   page.** is spec
24600 69 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77  ial and is allow
24610 65 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20  ed to be nearly 
24620 65 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20  empty. If pPage 
24630 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  is .** the root 
24640 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64  page, then the d
24650 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
24660 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
24670 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61  sed.** or decrea
24680 73 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e  sed by one, as n
24690 65 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65  ecessary, to kee
246a0 70 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  p the root page 
246b0 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76  from being.** ov
246c0 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65  erfull or comple
246d0 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  tely empty..**.*
246e0 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
246f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24700 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
24710 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50   the Cells on pP
24720 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  age.** might not
24730 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f   actually be sto
24740 72 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44  red in pPage->aD
24750 61 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e  ata[].  This can
24760 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68   happen.** if th
24770 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  e page is overfu
24780 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65  ll.  Part of the
24790 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
247a0 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61  tine is to.** ma
247b0 6b 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c  ke sure all Cell
247c0 73 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65  s for pPage once
247d0 20 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50   again fit in pP
247e0 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a  age->aData[]..**
247f0 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
24800 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
24810 68 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70  he siblings of p
24820 50 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74  Page, the parent
24830 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   of pPage.** mig
24840 68 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  ht become overfu
24850 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
24860 20 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e    If that happen
24870 73 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  s, then this rou
24880 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
24890 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  d recursively on
248a0 20 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   the parent..**.
248b0 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
248c0 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
248d0 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
248e0 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
248f0 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
24900 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53  rupted state.  S
24910 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
24920 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
24930 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
24940 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
24950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
24960 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65  lance_nonroot(Me
24970 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
24980 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
24990 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
249a0 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
249b0 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
249c0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
249d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
249e0 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
249f0 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24a10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
24a20 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
24a30 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
24a40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
24a50 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
24a60 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
24a70 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
24a80 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24aa0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
24ab0 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
24ac0 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ae0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
24af0 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
24b00 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20   int nDiv;      
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b20 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
24b30 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20   in apDiv[] */. 
24b40 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
24b70 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61   /* Index of pPa
24ba0 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ge in pParent->a
24bb0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
24bc0 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
24bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
24be0 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
24bf0 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
24c00 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
24c30 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
24c40 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
24c50 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
24c60 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
24c70 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
24c80 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ca0 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
24cb0 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
24cc0 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
24cd0 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
24ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24cf0 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
24d00 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
24d10 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
24d20 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
24d30 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
24d40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
24d50 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
24d60 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
24d70 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
24d80 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
24d90 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
24da0 20 69 6e 74 20 69 53 70 61 63 65 20 3d 20 30 3b   int iSpace = 0;
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24dc0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
24dd0 74 65 20 6f 66 20 61 53 70 61 63 65 5b 5d 20 2a  te of aSpace[] *
24de0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
24df0 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
24e00 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
24e10 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
24e20 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f   */.  Pgno pgnoO
24e30 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
24e40 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
24e50 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
24e60 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
24e70 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
24e80 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
24e90 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
24ea0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
24eb0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
24ec0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
24ed0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
24ee0 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
24ef0 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
24f00 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
24f10 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
24f20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
24f30 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
24f40 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  e in apNew[] */.
24f50 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b    u8 *apDiv[NB];
24f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24f70 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
24f80 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
24f90 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
24fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24fb0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
24fc0 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
24fd0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
24fe0 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
24ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
25000 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
25010 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
25020 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
25030 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
25040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
25050 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
25060 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
25070 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
25080 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
25090 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
250a0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
250b0 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42  /.  u8 *aCopy[NB
250c0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
250d0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f   /* Space for ho
250e0 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70  lding data of ap
250f0 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Copy[] */.  u8 *
25100 61 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  aSpace;         
25110 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
25120 65 20 74 6f 20 68 6f 6c 64 20 63 6f 70 69 65 73  e to hold copies
25130 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
25140 6c 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ls */.#ifndef SQ
25150 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
25160 43 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d  CUUM.  u8 *aFrom
25170 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
25180 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25190 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
251a0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
251b0 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e  ..  /* .  ** Fin
251c0 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  d the parent pag
251d0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
251e0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
251f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25200 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25210 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
25220 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  age) || pPage->n
25230 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
25240 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
25250 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
25260 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
25270 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
25280 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
25290 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
252a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
252b0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20  rent->pDbPage)) 
252c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
252d0 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  ;.  }.  TRACE(("
252e0 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
252f0 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
25300 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
25310 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
25320 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  o));..#ifndef SQ
25330 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
25340 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a  ALANCE.  /*.  **
25350 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a   A special case:
25360 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79    If a new entry
25370 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69   has just been i
25380 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20  nserted into a. 
25390 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20   ** table (that 
253a0 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68  is, a btree with
253b0 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e   integer keys an
253c0 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68  d all data at th
253d0 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61  e leaves).  ** a
253e0 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  nd the new entry
253f0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
25400 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
25410 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65  tree (it has the
25420 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65  .  ** largest ke
25430 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  y) then use the 
25440 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f  special balance_
25450 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  quick() routine 
25460 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  for.  ** balanci
25470 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69  ng.  balance_qui
25480 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73  ck() is much fas
25490 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20  ter and results 
254a0 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a  in a tighter.  *
254b0 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74  * packing of dat
254c0 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  a in the common 
254d0 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
254e0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a   pPage->leaf &&.
254f0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
25500 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61  Key &&.      pPa
25510 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a  ge->leafData &&.
25520 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
25530 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20  erflow==1 &&.   
25540 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
25550 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
25560 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50  Cell &&.      pP
25570 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67  age->pParent->pg
25580 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67  no!=1 &&.      g
25590 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
255a0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
255b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
255c0 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b  pPage->pgno.  ){
255d0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
255e0 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73  ODO: Check the s
255f0 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c  iblings to the l
25600 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74  eft of pPage. It
25610 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20   may be that.   
25620 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74   ** they are not
25630 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77   full and no new
25640 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
25650 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  d..    */.    re
25660 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69  turn balance_qui
25670 63 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ck(pPage, pParen
25680 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  t);.  }.#endif..
25690 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
256a0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
256b0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
256c0 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
256d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
256e0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
256f0 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  the cell in the 
25700 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73  parent page whos
25710 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69  e left child poi
25720 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f  nts back.  ** to
25730 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64   pPage.  The "id
25740 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74  x" variable is t
25750 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
25760 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65   cell.  If pPage
25770 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67  .  ** is the rig
25780 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  htmost child of 
25790 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74  pParent then set
257a0 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d   idx to pParent-
257b0 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69  >nCell .  */.  i
257c0 66 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  f( pParent->idxS
257d0 68 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  hift ){.    Pgno
257e0 20 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20   pgno;.    pgno 
257f0 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  = pPage->pgno;. 
25800 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d     assert( pgno=
25810 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
25820 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
25830 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66  DbPage) );.    f
25840 6f 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50  or(idx=0; idx<pP
25850 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64  arent->nCell; id
25860 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  x++){.      if( 
25870 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
25880 6c 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29  l(pParent, idx))
25890 3d 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ==pgno ){.      
258a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
258b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
258c0 74 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e  t( idx<pParent->
258d0 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  nCell.          
258e0 20 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26     || get4byte(&
258f0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
25900 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
25910 74 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20  t+8])==pgno );. 
25920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20   }else{.    idx 
25930 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65  = pPage->idxPare
25940 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  nt;.  }..  /*.  
25950 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61  ** Initialize va
25960 72 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20  riables so that 
25970 69 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20  it will be safe 
25980 74 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72  to jump.  ** dir
25990 65 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65  ectly to balance
259a0 5f 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20  _cleanup at any 
259b0 6d 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e  moment..  */.  n
259c0 4f 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a  Old = nNew = 0;.
259d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
259e0 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  f(pParent->pDbPa
259f0 67 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ge);..  /*.  ** 
25a00 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67  Find sibling pag
25a10 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20  es to pPage and 
25a20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
25a30 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65  rent that divide
25a40 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e  .  ** the siblin
25a50 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20  gs.  An attempt 
25a60 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
25a70 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
25a80 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20  ither.  ** side 
25a90 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20  of pPage.  More 
25aa0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
25ab0 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
25ac0 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20  , however, if.  
25ad0 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61  ** pPage there a
25ae0 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
25af0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
25b00 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66   other side.  If
25b10 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
25b20 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
25b30 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
25b40 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
25b50 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20  ent are taken.. 
25b60 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64   */.  nxDiv = id
25b70 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78  x - NN;.  if( nx
25b80 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65  Div + NB > pPare
25b90 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
25ba0 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74   nxDiv = pParent
25bb0 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31  ->nCell - NB + 1
25bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69  ;.  }.  if( nxDi
25bd0 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  v<0 ){.    nxDiv
25be0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76   = 0;.  }.  nDiv
25bf0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 0;.  for(i=0,
25c00 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20   k=nxDiv; i<NB; 
25c10 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69  i++, k++){.    i
25c20 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43  f( k<pParent->nC
25c30 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44  ell ){.      apD
25c40 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
25c50 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20  (pParent, k);.  
25c60 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20      nDiv++;.    
25c70 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65    assert( !pPare
25c80 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  nt->leaf );.    
25c90 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
25ca0 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
25cb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
25cc0 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65   k==pParent->nCe
25cd0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  ll ){.      pgno
25ce0 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
25cf0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
25d00 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
25d10 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
25d20 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
25d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
25d40 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
25d50 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c  pBt, pgnoOld[i],
25d60 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72   &apOld[i], pPar
25d70 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
25d80 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
25d90 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f  cleanup;.    apO
25da0 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74  ld[i]->idxParent
25db0 20 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79   = k;.    apCopy
25dc0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  [i] = 0;.    ass
25dd0 65 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a  ert( i==nOld );.
25de0 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20      nOld++;.    
25df0 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
25e00 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
25e10 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
25e20 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ow;.  }..  /* Ma
25e30 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d  ke nMaxCells a m
25e40 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20  ultiple of 4 in 
25e50 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76  order to preserv
25e60 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c  e 8-byte.  ** al
25e70 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61  ignment */.  nMa
25e80 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65  xCells = (nMaxCe
25e90 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20  lls + 3)&~3;..  
25ea0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
25eb0 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
25ec0 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a  y structures.  *
25ed0 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  /.  apCell = sql
25ee0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 0a 20 20  ite3_malloc( .  
25ef0 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
25f00 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
25f30 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
25f40 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
25f70 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a     + (ROUND8(siz
25f80 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42  eof(MemPage))+pB
25f90 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20  t->pageSize)*NB 
25fa0 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20   /* aCopy */.   
25fb0 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
25fc0 65 2a 35 20 20 20 20 20 20 20 20 20 20 20 20 20  e*5             
25fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fe0 2f 2a 20 61 53 70 61 63 65 20 2a 2f 0a 20 20 20  /* aSpace */.   
25ff0 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55    + (ISAUTOVACUU
26000 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20  M ? nMaxCells : 
26010 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0)              
26020 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b  /* aFrom */.  );
26030 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
26040 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
26050 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
26060 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
26070 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c  nup;.  }.  szCel
26080 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
26090 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
260a0 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29  aCopy[0] = (u8*)
260b0 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
260c0 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  s];.  assert( ((
260d0 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29  aCopy[0] - (u8*)
260e0 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
260f0 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
26100 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
26110 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
26120 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43  NB; i++){.    aC
26130 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b  opy[i] = &aCopy[
26140 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  i-1][pBt->pageSi
26150 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
26160 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20  (MemPage))];.   
26170 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79   assert( ((aCopy
26180 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  [i] - (u8*)apCel
26190 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
261a0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
261b0 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
261c0 7d 0a 20 20 61 53 70 61 63 65 20 3d 20 26 61 43  }.  aSpace = &aC
261d0 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70  opy[NB-1][pBt->p
261e0 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
261f0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
26200 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 53  ;.  assert( ((aS
26210 70 61 63 65 20 2d 20 28 75 38 2a 29 61 70 43 65  pace - (u8*)apCe
26220 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
26230 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
26240 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 23  nt required */.#
26250 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26260 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
26270 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26280 75 75 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d  uum ){.    aFrom
26290 20 3d 20 26 61 53 70 61 63 65 5b 35 2a 70 42 74   = &aSpace[5*pBt
262a0 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d  ->pageSize];.  }
262b0 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a  .#endif.  .  /*.
262c0 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73    ** Make copies
262d0 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
262e0 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74 73  of pPage and its
262f0 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61   siblings into a
26300 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20  Old[]..  ** The 
26310 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
26320 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
26330 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
26340 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20  ies rather.  ** 
26350 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
26360 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
26370 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
26380 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
26390 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
263a0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
263b0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  n..  */.  for(i=
263c0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
263d0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20  .    MemPage *p 
263e0 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d  = apCopy[i] = (M
263f0 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d  emPage*)aCopy[i]
26400 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
26410 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
26420 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
26430 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  p->aData = (void
26440 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  *)&p[1];.    mem
26450 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70  cpy(p->aData, ap
26460 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
26470 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
26480 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
26490 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
264a0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
264b0 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
264c0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
264d0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
264e0 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
264f0 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
26500 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
26510 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
26520 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
26530 6f 72 6d 20 61 53 70 61 63 65 5b 5d 20 61 6e 64  orm aSpace[] and
26540 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
26550 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
26560 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
26570 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
26580 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
26590 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
265a0 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
265b0 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
265c0 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
265d0 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
265e0 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
265f0 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
26600 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
26610 61 63 65 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ace[].  In this 
26620 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
26630 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
26640 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
26650 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
26660 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
26670 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
26680 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
26690 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
266a0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
266b0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
266c0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
266d0 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
266e0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
266f0 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
26700 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
26710 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
26720 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
26730 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
26740 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
26750 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
26760 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
26770 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
26780 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  .  nCell = 0;.  
26790 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
267a0 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a   pPage->leaf*4;.
267b0 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61    leafData = pPa
267c0 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20  ge->leafData && 
267d0 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66  pPage->leaf;.  f
267e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
267f0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
26800 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
26810 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  [i];.    int lim
26820 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
26830 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
26840 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
26850 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
26860 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
26870 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
26880 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
26890 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
268a0 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
268b0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
268c0 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
268d0 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
268e0 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20  Cell]);.#ifndef 
268f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26900 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
26910 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26920 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
26930 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
26940 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20  [nCell] = i;.   
26950 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c       for(a=0; a<
26960 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
26970 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   a++){.         
26980 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c   if( pOld->aOvfl
26990 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c  [a].pCell==apCel
269a0 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20  l[nCell] ){.    
269b0 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
269c0 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
269d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
269e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
269f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
26a00 6e 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c  ndif.      nCell
26a10 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
26a20 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20  ( i<nOld-1 ){.  
26a30 20 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c      u16 sz = cel
26a40 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
26a50 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
26a60 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
26a70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69  ){.        /* Wi
26a80 74 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20  th the LEAFDATA 
26a90 66 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65  flag, pParent ce
26aa0 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e  lls hold only IN
26ab0 54 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20  TKEYs that.     
26ac0 20 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63     ** are duplic
26ad0 61 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20  ates of keys on 
26ae0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e  the child pages.
26af0 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d    We need to rem
26b00 6f 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ove.        ** t
26b10 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
26b20 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62   from pParent, b
26b30 75 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20  ut the dividers 
26b40 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20  cells are not.  
26b50 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74        ** added t
26b60 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75  o apCell[] becau
26b70 73 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c  se they are dupl
26b80 69 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20  icates of child 
26b90 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  cells..        *
26ba0 2f 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  /.        dropCe
26bb0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
26bc0 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65  v, sz);.      }e
26bd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20  lse{.        u8 
26be0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20  *pTemp;.        
26bf0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
26c00 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
26c10 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
26c20 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70   = sz;.        p
26c30 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
26c40 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
26c50 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
26c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
26c70 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
26c80 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
26c90 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
26ca0 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
26cb0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
26cc0 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
26cd0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e  Correction;.#ifn
26ce0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26cf0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
26d00 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
26d10 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
26d20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d      aFrom[nCell]
26d30 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20   = 0xFF;.       
26d40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
26d50 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
26d60 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a  nt, nxDiv, sz);.
26d70 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
26d80 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72  Cell] -= leafCor
26d90 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
26da0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
26db0 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c  e(pTemp)==pgnoOl
26dc0 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  d[i] );.        
26dd0 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
26de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
26df0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
26e00 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
26e10 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
26e20 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
26e30 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
26e40 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
26e50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
26e60 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
26e70 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
26e80 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
26e90 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
26ea0 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e  ld->aData[pOld->
26eb0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29  hdrOffset+8], 4)
26ec0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26ed0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26ee0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
26ef0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
26f00 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
26f10 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
26f20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
26f30 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
26f40 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
26f50 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
26f60 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
26f70 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  ] = 4;.         
26f80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26f90 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
26fa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26fb0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
26fc0 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
26fd0 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
26fe0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
26ff0 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
27000 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
27010 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
27020 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
27030 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
27040 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
27050 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
27060 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
27070 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
27080 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
27090 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
270a0 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
270b0 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
270c0 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
270d0 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
270e0 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
270f0 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
27100 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
27110 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
27120 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
27130 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
27140 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
27150 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
27160 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
27170 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
27180 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
27190 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
271a0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
271b0 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
271c0 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
271d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
271e0 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
271f0 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
27200 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
27210 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
27220 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
27230 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
27240 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
27250 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
27260 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
27270 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
27280 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
27290 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
272a0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
272b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
272c0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
272d0 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
272e0 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
272f0 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
27300 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
27310 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
27320 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
27330 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
27340 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
27350 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
27360 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
27370 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
27380 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    k++;.    }.  }
27390 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
273a0 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
273b0 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
273c0 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
273d0 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
273e0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
273f0 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
27400 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
27410 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
27420 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
27430 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
27440 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
27450 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
27460 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
27470 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
27480 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
27490 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
274a0 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
274b0 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
274c0 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
274d0 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
274e0 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
274f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
27500 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
27510 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
27520 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
27530 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
27540 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
27550 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
27560 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
27570 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
27580 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
27590 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
275a0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
275b0 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
275c0 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
275d0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
275e0 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
275f0 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
27600 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
27610 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
27620 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
27630 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
27640 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
27650 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
27660 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
27670 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
27680 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27690 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
276a0 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
276b0 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
276c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
276d0 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
276e0 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
276f0 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
27700 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
27710 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
27720 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
27730 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
27740 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
27750 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
27760 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
27770 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
27780 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
27790 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
277a0 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
277b0 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
277c0 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
277d0 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
277e0 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
277f0 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
27800 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
27810 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
27820 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
27830 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
27840 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
27850 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
27860 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
27870 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
27880 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
27890 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
278a0 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
278b0 30 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65  0) or we are the
278c0 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
278d0 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
278e0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
278f0 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
27900 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
27910 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
27920 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
27930 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
27940 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
27950 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
27960 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
27970 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
27980 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  ell==0) );..  /*
27990 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
279a0 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
279b0 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
279c0 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
279d0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
279e0 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
279f0 61 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65  ageFlags = pPage
27a00 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
27a10 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
27a20 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
27a30 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
27a40 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
27a50 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
27a60 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pOld[i];.      p
27a70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
27a80 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  Old[i];.      ap
27a90 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
27aa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27ab0 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70  gerWrite(pNew->p
27ac0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e  DbPage);.      n
27ad0 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  New++;.      if(
27ae0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
27af0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
27b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
27b10 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
27b20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
27b30 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
27b40 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d  New, &pgnoNew[i]
27b50 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20  , pgnoNew[i-1], 
27b60 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
27b70 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
27b80 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
27b90 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
27ba0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
27bb0 20 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65    }.    zeroPage
27bc0 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
27bd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65  );.  }..  /* Fre
27be0 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
27bf0 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
27c00 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
27c10 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
27c20 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72   i<nOld ){.    r
27c30 63 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f  c = freePage(apO
27c40 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
27c50 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
27c60 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
27c70 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
27c80 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
27c90 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
27ca0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27cb0 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
27cc0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
27cd0 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
27ce0 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
27cf0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
27d00 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
27d10 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
27d20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
27d30 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
27d40 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
27d50 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
27d60 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
27d70 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
27d80 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
27d90 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
27da0 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
27db0 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
27dc0 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
27dd0 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
27de0 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
27df0 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
27e00 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
27e10 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
27e20 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
27e30 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
27e40 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
27e50 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
27e60 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
27e70 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
27e80 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
27e90 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
27ea0 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
27eb0 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
27ec0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
27ed0 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
27ee0 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67     int minV = pg
27ef0 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e  noNew[i];.    in
27f00 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20  t minI = i;.    
27f10 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20  for(j=i+1; j<k; 
27f20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
27f30 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69  pgnoNew[j]<(unsi
27f40 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
27f50 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
27f60 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67         minV = pg
27f70 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20  noNew[j];.      
27f80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
27f90 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
27fa0 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d  int t;.      Mem
27fb0 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
27fc0 74 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  t = pgnoNew[i];.
27fd0 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
27fe0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
27ff0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b  ew[i] = pgnoNew[
28000 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
28010 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
28020 6e 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  nI];.      pgnoN
28030 65 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20  ew[minI] = t;.  
28040 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
28050 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
28060 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
28070 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
28080 20 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64    new: %d(%d) %d
28090 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
280a0 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
280b0 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20    pgnoOld[0], . 
280c0 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e     nOld>=2 ? pgn
280d0 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  oOld[1] : 0,.   
280e0 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f   nOld>=3 ? pgnoO
280f0 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70  ld[2] : 0,.    p
28100 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77  gnoNew[0], szNew
28110 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
28120 20 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20   ? pgnoNew[1] : 
28130 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
28140 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
28150 4e 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77  New>=3 ? pgnoNew
28160 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  [2] : 0, nNew>=3
28170 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
28180 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70  .    nNew>=4 ? p
28190 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e  gnoNew[3] : 0, n
281a0 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
281b0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
281c0 3d 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20  =5 ? pgnoNew[4] 
281d0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
281e0 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
281f0 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
28200 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
28210 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
28220 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
28230 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
28240 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
28250 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
28260 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
28270 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
28280 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
28290 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
282a0 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
282b0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
282c0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
282d0 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
282e0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
282f0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
28300 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e   pNew->pgno==pgn
28310 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61  oNew[i] );.    a
28320 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
28330 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
28340 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
28350 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
28360 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
28370 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
28380 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
28390 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
283a0 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
283b0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
283c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
283d0 55 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  UUM.    /* If th
283e0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
283f0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
28400 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
28410 72 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r map entries.  
28420 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
28430 74 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  to the siblings 
28440 74 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61  that were rearra
28450 6e 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20  nged. These can 
28460 62 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  be: left.    ** 
28470 63 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c  children of cell
28480 73 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  s, the right-chi
28490 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ld of the page, 
284a0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
284b0 73 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64  s.    ** pointed
284c0 20 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20   to by cells..  
284d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74    */.    if( pBt
284e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
284f0 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b        for(k=j; k
28500 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29  <cntNew[i]; k++)
28510 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
28520 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( k<nMaxCells );
28530 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72  .        if( aFr
28540 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61  om[k]==0xFF || a
28550 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d  pCopy[aFrom[k]]-
28560 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
28570 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  o ){.          r
28580 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
28590 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20  l(pNew, k-j);.  
285a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
285b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
285c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
285d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
285e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
285f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28600 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a   }.#endif..    j
28610 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
28620 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
28630 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
28640 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
28650 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
28660 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
28670 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
28680 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
28690 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
286a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e   */.    if( i<nN
286b0 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20  ew-1 && j<nCell 
286c0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
286d0 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
286e0 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
286f0 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
28700 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
28710 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
28720 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
28730 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
28740 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
28750 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
28760 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
28770 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
28780 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
28790 20 34 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   4);.        pTe
287a0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
287b0 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
287c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
287d0 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
287e0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
287f0 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
28800 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
28810 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
28820 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
28830 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
28840 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
28850 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
28860 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
28870 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
28880 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
28890 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
288a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
288b0 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
288c0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
288d0 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
288e0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
288f0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
28900 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  -;.        sqlit
28910 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
28920 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
28930 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
28940 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 61 53       pCell = &aS
28950 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20  pace[iSpace];.  
28960 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c        fillInCell
28970 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c  (pParent, pCell,
28980 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
28990 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20  , 0, 0, &sz);.  
289a0 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20        iSpace += 
289b0 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
289c0 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d  rt( iSpace<=pBt-
289d0 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20  >pageSize*5 );. 
289e0 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
289f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28a00 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
28a10 34 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  4;.        pTemp
28a20 20 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63   = &aSpace[iSpac
28a30 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  e];.        iSpa
28a40 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
28a50 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
28a60 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  <=pBt->pageSize*
28a70 35 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 );.        /* 
28a80 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
28a90 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
28aa0 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
28ab0 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
28ac0 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
28ad0 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
28ae0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
28af0 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
28b00 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
28b10 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
28b20 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
28b30 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
28b40 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
28b50 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
28b60 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
28b70 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
28b80 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
28b90 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
28ba0 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
28bb0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
28bc0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
28bd0 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
28be0 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
28bf0 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
28c00 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
28c10 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
28c20 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
28c30 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
28c40 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
28c50 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
28c60 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
28c70 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
28c80 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
28c90 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
28ca0 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
28cb0 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
28cc0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
28cd0 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
28ce0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
28cf0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
28d00 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
28d10 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
28d20 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
28d30 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
28d40 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
28d50 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
28d60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28d70 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
28d80 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
28d90 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
28da0 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69  emp, 4);.      i
28db0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28dc0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
28dd0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70  cleanup;.      p
28de0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
28df0 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
28e00 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70  ,nxDiv), pNew->p
28e10 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
28e20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28e30 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
28e40 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
28e50 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
28e60 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66  , and not a leaf
28e70 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20  -data tree,.    
28e80 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65    ** then update
28e90 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
28ea0 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66   with an entry f
28eb0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
28ec0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  page.      ** th
28ed0 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74  at the cell just
28ee0 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73   inserted points
28ef0 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20   to (if any)..  
28f00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
28f10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28f20 20 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b   && !leafData ){
28f30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
28f40 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72  rmapPutOvfl(pPar
28f50 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20  ent, nxDiv);.   
28f60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28f70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28f80 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
28f90 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
28fa0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
28fb0 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  if.      j++;.  
28fc0 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
28fd0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
28fe0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
28ff0 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
29000 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
29010 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
29020 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
29030 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63  )==0 ){.    memc
29040 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
29050 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70  ]->aData[8], &ap
29060 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
29070 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a  ata[8], 4);.  }.
29080 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
29090 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
290a0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
290b0 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
290c0 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
290d0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
290e0 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
290f0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
29100 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
29110 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
29120 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
29130 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
29140 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
29150 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
29160 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
29170 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
29180 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
29190 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
291a0 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
291b0 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
291c0 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
291d0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
291e0 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
291f0 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
29200 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20  *.  ** Reparent 
29210 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20  children of all 
29220 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  cells..  */.  fo
29230 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
29240 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  ++){.    rc = re
29250 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
29260 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20  (apNew[i]);.    
29270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29280 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
29290 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
292a0 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
292b0 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29  ldPages(pParent)
292c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
292d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
292e0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20  ance_cleanup;.. 
292f0 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65   /*.  ** Balance
29300 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
29310 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
29320 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70   current page (p
29330 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a  Page) might.  **
29340 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
29350 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
29360 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20   so it might no 
29370 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61  longer be initia
29380 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  lized..  ** But 
29390 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
293a0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69  will always be i
293b0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
293c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
293d0 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
293e0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
293f0 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f  rent, 0);.  .  /
29400 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
29410 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
29420 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
29430 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
29440 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
29450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
29460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
29470 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
29480 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
29490 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
294a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
294b0 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apNew[i]);.  }. 
294c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
294d0 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28  rent);.  TRACE((
294e0 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
294f0 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d  ed with %d: old=
29500 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d  %d new=%d cells=
29510 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
29520 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f   pPage->pgno, nO
29530 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29  ld, nNew, nCell)
29540 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29550 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
29560 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
29570 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
29580 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65  e of a btree whe
29590 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  n the root.** pa
295a0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
295b0 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61  ells.  This is a
295c0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
295d0 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a   make the tree.*
295e0 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f  * shallower by o
295f0 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ne level..*/.sta
29600 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
29610 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67  shallower(MemPag
29620 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d  e *pPage){.  Mem
29630 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
29640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29650 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65   only child page
29660 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50   of pPage */.  P
29670 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
29680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29690 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
296a0 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72  Child */.  int r
296b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
296c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
296d0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70  n code from subp
296e0 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42  rocedures */.  B
296f0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29710 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65  * The main BTree
29720 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
29730 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  int mxCellPerPag
29740 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
29750 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
29760 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65  f cells per page
29770 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
29780 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
29790 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
297a0 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67  from pages being
297b0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
297c0 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
297d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
297e0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
297f0 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73   cells */..  ass
29800 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72  ert( pPage->pPar
29810 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ent==0 );.  asse
29820 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
29830 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29850 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
29860 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20  mutex) );.  pBt 
29870 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
29880 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20  mxCellPerPage = 
29890 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20  MX_CELL(pBt);.  
298a0 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
298b0 5f 6d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50  _malloc( mxCellP
298c0 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
298d0 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29  8*)+sizeof(u16))
298e0 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
298f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
29900 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
29910 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
29920 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
29930 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
29940 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
29950 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
29960 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
29970 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
29980 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
29990 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
299a0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
299b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
299c0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
299d0 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
299e0 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
299f0 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
29a00 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
29a10 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
29a20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
29a30 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
29a40 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
29a50 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
29a60 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
29a70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
29a80 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
29a90 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
29aa0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
29ab0 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
29ac0 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
29ad0 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
29ae0 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
29af0 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
29b00 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
29b10 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
29b20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
29b30 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
29b40 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
29b50 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
29b60 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
29b70 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
29b80 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
29b90 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
29ba0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
29bb0 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
29bc0 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
29bd0 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
29be0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
29bf0 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
29c00 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
29c10 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
29c20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
29c30 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
29c40 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
29c50 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
29c60 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
29c70 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
29c80 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
29c90 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
29ca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29cb0 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65  gnoChild<=sqlite
29cc0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
29cd0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
29ce0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
29cf0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
29d00 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  age(pPage->pBt, 
29d10 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69  pgnoChild, &pChi
29d20 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ld, 0);.    if( 
29d30 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
29d40 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
29d50 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67     if( pPage->pg
29d60 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  no==1 ){.      r
29d70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
29d80 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  InitPage(pChild,
29d90 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69   pPage);.      i
29da0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
29db0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
29dc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29dd0 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
29de0 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  w==0 );.      if
29df0 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
29e00 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
29e10 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66  /* The child inf
29e20 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69  ormation will fi
29e30 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  t on the root pa
29e40 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20  ge, so do the.  
29e50 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f        ** copy */
29e60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
29e70 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65          zeroPage
29e80 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
29e90 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
29ea0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
29eb0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
29ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
29ed0 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  ell[i] = findCel
29ee0 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20  l(pChild,i);.   
29ef0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d         szCell[i]
29f00 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
29f10 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d  Child, apCell[i]
29f20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29f30 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67       assemblePag
29f40 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
29f50 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20  >nCell, apCell, 
29f60 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20  szCell);.       
29f70 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67   /* Copy the rig
29f80 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht-pointer of th
29f90 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70  e child to the p
29fa0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
29fb0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
29fc0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
29fd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20  hdrOffset+8], . 
29fe0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
29ff0 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61  yte(&pChild->aDa
2a000 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66  ta[pChild->hdrOf
2a010 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2a020 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
2a030 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ld);.        TRA
2a040 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
2a050 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20  ild %d transfer 
2a060 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  to page 1\n", pC
2a070 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
2a080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a090 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
2a0a0 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  has more informa
2a0b0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66  tion that will f
2a0c0 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a  it on the root..
2a0d0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
2a0e0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62  ree is already b
2a0f0 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74  alanced.  Do not
2a100 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hing. */.       
2a110 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2a120 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20  : child %d will 
2a130 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20  not fit on page 
2a140 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
2a150 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
2a160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
2a170 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61  emcpy(pPage->aDa
2a180 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ta, pChild->aDat
2a190 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  a, pPage->pBt->u
2a1a0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
2a1b0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
2a1c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
2a1d0 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20  ->pParent = 0;. 
2a1e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a1f0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2a200 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Page, 0);.      
2a210 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2a220 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66  TE_OK );.      f
2a230 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
2a240 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42  .      TRACE(("B
2a250 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72  ALANCE: transfer
2a260 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72   child %d into r
2a270 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  oot %d\n",.     
2a280 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d           pChild-
2a290 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67  >pgno, pPage->pg
2a2a0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
2a2b0 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
2a2c0 6c 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a  ldPages(pPage);.
2a2d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a2e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2a2f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2a300 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2a310 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
2a320 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2a330 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2a340 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
2a350 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a  ->nCell; i++){ .
2a360 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2a370 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65  mapPutOvfl(pPage
2a380 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
2a390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2a3b0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
2a3c0 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d  lance;.        }
2a3d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
2a3e0 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73  endif.    releas
2a3f0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2a400 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62   }.end_shallow_b
2a410 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65  alance:.  sqlite
2a420 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  3_free(apCell);.
2a430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a440 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  ./*.** The root 
2a450 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
2a460 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
2a470 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65   happens, Create
2a480 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
2a490 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a  e and copy the.*
2a4a0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
2a4b0 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20  e root into the 
2a4c0 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b  child.  Then mak
2a4d0 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  e the root.** pa
2a4e0 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  ge an empty page
2a4f0 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64   with rightChild
2a500 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2a510 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20   new.** child.  
2a520 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62   Finally, call b
2a530 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28  alance_internal(
2a540 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69  ) on the new chi
2a550 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69  ld.** to cause i
2a560 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73  t to split..*/.s
2a570 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2a580 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
2a590 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
2a5a0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2a5b0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
2a5c0 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
2a5d0 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
2a5e0 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50  *pChild;    /* P
2a5f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
2a600 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2a610 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
2a620 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2a630 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
2a640 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
2a650 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2a660 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
2a670 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
2a680 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f  eSize;     /* To
2a690 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20  tal usable size 
2a6a0 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75  of a page */.  u
2a6b0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
2a6c0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2a6d0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2a6e0 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b   */.  u8 *cdata;
2a6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2a700 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c  tent of the chil
2a710 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2a720 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
2a730 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
2a740 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65  e header in pare
2a750 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b  nt */.  int brk;
2a760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2a770 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74  ffset to content
2a780 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69   of first cell i
2a790 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61  n parent */..  a
2a7a0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
2a7b0 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
2a7c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2a7d0 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42  erflow>0 );.  pB
2a7e0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2a7f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a800 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2a810 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
2a820 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2a830 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c  Page(pBt, &pChil
2a840 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70  d, &pgnoChild, p
2a850 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a  Page->pgno, 0);.
2a860 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a870 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  n rc;.  assert( 
2a880 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a890 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
2a8a0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73  pDbPage) );.  us
2a8b0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
2a8c0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
2a8d0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2a8e0 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
2a8f0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 62  ->hdrOffset;.  b
2a900 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
2a910 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63  ata[hdr+5]);.  c
2a920 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61  data = pChild->a
2a930 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63  Data;.  memcpy(c
2a940 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d  data, &data[hdr]
2a950 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  , pPage->cellOff
2a960 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
2a970 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70  ll-hdr);.  memcp
2a980 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20 26  y(&cdata[brk], &
2a990 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c  data[brk], usabl
2a9a0 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61 73  eSize-brk);.  as
2a9b0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69 73  sert( pChild->is
2a9c0 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20  Init==0 );.  rc 
2a9d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2a9e0 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70  itPage(pChild, p
2a9f0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2aa00 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
2aa10 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  eper_out;.  memc
2aa20 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
2aa30 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20  , pPage->aOvfl, 
2aa40 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2aa50 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  *sizeof(pPage->a
2aa60 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
2aa70 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
2aa80 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2aa90 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d  w;.  if( pChild-
2aaa0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2aab0 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 20    pChild->nFree 
2aac0 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2aad0 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
2aae0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
2aaf0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61  ;.  zeroPage(pPa
2ab00 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
2ab10 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
2ab20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2ab30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2ab40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
2ab50 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 54   pgnoChild);.  T
2ab60 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2ab70 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
2ab80 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  o %d\n", pPage->
2ab90 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
2aba0 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  no));.#ifndef SQ
2abb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2abc0 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
2abd0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2abe0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20    int i;.    rc 
2abf0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
2ac00 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50   pChild->pgno, P
2ac10 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2ac20 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ge->pgno);.    i
2ac30 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2ac40 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
2ac50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2ac60 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
2ac70 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
2ac80 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68  trmapPutOvfl(pCh
2ac90 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  ild, i);.      i
2aca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2acb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2acc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2acd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2ace0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
2acf0 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b 0a  onroot(pChild);.
2ad00 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f  .balancedeeper_o
2ad10 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
2ad20 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74  e(pChild);.  ret
2ad30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ad40 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20 70   Decide if the p
2ad50 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73 20  age pPage needs 
2ad60 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20  to be balanced. 
2ad70 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73   If balancing is
2ad80 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61  .** required, ca
2ad90 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ll the appropria
2ada0 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  te balancing rou
2adb0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
2adc0 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
2add0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2ade0 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72  insert){.  int r
2adf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ae00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ae10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2ae20 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2ae30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
2ae40 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  Parent==0 ){.   
2ae50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ae60 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2ae70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2ae80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ae90 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
2aea0 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ow>0 ){.      rc
2aeb0 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
2aec0 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  r(pPage);.    }.
2aed0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2aee0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e  TE_OK && pPage->
2aef0 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
2af00 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73    rc = balance_s
2af10 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b  hallower(pPage);
2af20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2af30 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
2af40 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20  Overflow>0 || . 
2af50 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74 20         (!insert 
2af60 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
2af70 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2af80 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20  leSize*2/3) ){. 
2af90 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2afa0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29  e_nonroot(pPage)
2afb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2afc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2afd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
2afe0 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72  hecks all cursor
2aff0 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
2b000 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  table pgnoRoot..
2b010 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f  ** If any of tho
2b020 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20  se cursors were 
2b030 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
2b040 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65  ag==0 in a diffe
2b050 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65  rent.** database
2b060 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64   connection (a d
2b070 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2b080 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74  on that shares t
2b090 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68  he pager.** cach
2b0a0 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  e with the curre
2b0b0 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61  nt connection) a
2b0c0 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f  nd that other co
2b0d0 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nnection .** is 
2b0e0 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55  not in the ReadU
2b0f0 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74  ncommmitted stat
2b100 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
2b110 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tine returns .**
2b120 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
2b130 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74 69 6f  **.** In additio
2b140 6e 20 74 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f  n to checking fo
2b150 72 20 72 65 61 64 2d 6c 6f 63 6b 73 20 28 77 68  r read-locks (wh
2b160 65 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ere a read-lock 
2b170 0a 2a 2a 20 6d 65 61 6e 73 20 61 20 63 75 72 73  .** means a curs
2b180 6f 72 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  or opened with w
2b190 72 46 6c 61 67 3d 3d 30 29 20 74 68 69 73 20 72  rFlag==0) this r
2b1a0 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6d 6f 76 65  outine also move
2b1b0 73 0a 2a 2a 20 61 6c 6c 20 77 72 69 74 65 20 63  s.** all write c
2b1c0 75 72 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74  ursors so that t
2b1d0 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
2b1e0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   to the .** firs
2b1f0 74 20 43 65 6c 6c 20 6f 6e 20 74 68 65 20 72 6f  t Cell on the ro
2b200 6f 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  ot page.  This i
2b210 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
2b220 75 73 65 20 61 6e 20 69 6e 73 65 72 74 20 0a 2a  use an insert .*
2b230 2a 20 6f 72 20 64 65 6c 65 74 65 20 6d 69 67 68  * or delete migh
2b240 74 20 63 68 61 6e 67 65 20 74 68 65 20 6e 75 6d  t change the num
2b250 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
2b260 61 20 70 61 67 65 20 6f 72 20 64 65 6c 65 74 65  a page or delete
2b270 0a 2a 2a 20 61 20 70 61 67 65 20 65 6e 74 69 72  .** a page entir
2b280 65 6c 79 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f  ely and we do no
2b290 74 20 77 61 6e 74 20 74 6f 20 6c 65 61 76 65 20  t want to leave 
2b2a0 61 6e 79 20 63 75 72 73 6f 72 73 20 0a 2a 2a 20  any cursors .** 
2b2b0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 6e 6f 6e 2d  pointing to non-
2b2c0 65 78 69 73 74 61 6e 74 20 70 61 67 65 73 20 6f  existant pages o
2b2d0 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  r cells..*/.stat
2b2e0 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64  ic int checkRead
2b2f0 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 42 74  Locks(Btree *pBt
2b300 72 65 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  ree, Pgno pgnoRo
2b310 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
2b320 78 63 6c 75 64 65 29 7b 0a 20 20 42 74 43 75 72  xclude){.  BtCur
2b330 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72  sor *p;.  BtShar
2b340 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65  ed *pBt = pBtree
2b350 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
2b360 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64   *db = pBtree->d
2b370 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
2b380 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
2b390 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
2b3a0 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
2b3b0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
2b3c0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d  xt){.    if( p==
2b3d0 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69  pExclude ) conti
2b3e0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2b3f0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2b400 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ALID ) continue;
2b410 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
2b420 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29  Root!=pgnoRoot )
2b430 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2b440 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
2b450 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b460 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70   *dbOther = p->p
2b470 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
2b480 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30 20   if( dbOther==0 
2b490 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62 4f  ||.         (dbO
2b4a0 74 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f  ther!=db && (dbO
2b4b0 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51  ther->flags & SQ
2b4c0 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2b4d0 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20  tted)==0) ){.   
2b4e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b4f0 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
2b500 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2b510 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 21   p->pPage->pgno!
2b520 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  =p->pgnoRoot ){.
2b530 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74        moveToRoot
2b540 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (p);.    }.  }. 
2b550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b560 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
2b570 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
2b580 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
2b590 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
2b5a0 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
2b5b0 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
2b5c0 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
2b5d0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
2b5e0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
2b5f0 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
2b600 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
2b610 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
2b620 74 65 33 5f 6d 61 6c 6c 6f 63 28 4d 58 5f 43 45  te3_malloc(MX_CE
2b630 4c 4c 5f 53 49 5a 45 28 70 42 74 29 29 3b 0a 20  LL_SIZE(pBt));. 
2b640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
2b650 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
2b660 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
2b670 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
2b680 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
2b690 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
2b6a0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
2b6b0 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
2b6c0 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
2b6d0 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
2b6e0 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
2b6f0 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
2b700 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
2b710 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2b720 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2b730 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2b740 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
2b750 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
2b760 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
2b770 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
2b780 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
2b790 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
2b7a0 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
2b7b0 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
2b7c0 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
2b7d0 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  th ignored..*/.i
2b7e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
2b7f0 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
2b800 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2b810 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
2b820 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
2b830 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
2b840 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
2b850 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2b860 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2b870 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
2b880 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
2b890 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
2b8a0 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
2b8b0 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
2b8c0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
2b8d0 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b8f0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
2b900 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2b910 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
2b920 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20  t appendBias    
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b940 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2b950 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
2b960 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2b970 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e  .  int loc;.  in
2b980 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50 61  t szNew;.  MemPa
2b990 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
2b9a0 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
2b9b0 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
2b9c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2b9d0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2b9e0 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
2b9f0 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
2ba00 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
2ba10 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2ba20 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
2ba30 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2ba40 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2ba50 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2ba60 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2ba70 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69  ction before doi
2ba80 6e 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a  ng an insert */.
2ba90 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2baa0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2bab0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2bac0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2bad0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2bae0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2baf0 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21 70  Only );.  if( !p
2bb00 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20  Cur->wrFlag ){. 
2bb10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bb20 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72 73  _PERM;   /* Curs
2bb30 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20  or not open for 
2bb40 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2bb50 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2bb60 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2bb70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2bb80 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72  , pCur) ){.    r
2bb90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2bba0 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2bbb0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2bbc0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2bbd0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
2bbe0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2bbf0 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2bc00 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2bc10 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  p;.  }..  /* Sav
2bc20 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
2bc30 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
2bc40 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
2bc50 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c 65  s table */.  cle
2bc60 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2bc70 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20  (pCur);.  if( . 
2bc80 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
2bc90 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2bca0 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2bcb0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c  noRoot, pCur)) |
2bcc0 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  |.    SQLITE_OK!
2bcd0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  =(rc = sqlite3Bt
2bce0 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
2bcf0 70 4b 65 79 2c 20 30 2c 20 6e 4b 65 79 2c 20 61  pKey, 0, nKey, a
2bd00 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29  ppendBias, &loc)
2bd10 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2bd20 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  n rc;.  }..  pPa
2bd30 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2bd40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2bd50 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
2bd60 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
2bd70 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
2bd80 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74   !pPage->leafDat
2bd90 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49  a );.  TRACE(("I
2bda0 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20  NSERT: table=%d 
2bdb0 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d  nkey=%lld ndata=
2bdc0 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22  %d page=%d %s\n"
2bdd0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ,.          pCur
2bde0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79  ->pgnoRoot, nKey
2bdf0 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  , nData, pPage->
2be00 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
2be10 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72  loc==0 ? "overwr
2be20 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72  ite" : "new entr
2be30 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y"));.  assert( 
2be40 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2be50 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  .  allocateTempS
2be60 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77  pace(pBt);.  new
2be70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70  Cell = pBt->pTmp
2be80 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77  Space;.  if( new
2be90 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
2bea0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2beb0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
2bec0 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c  (pPage, newCell,
2bed0 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61   pKey, nKey, pDa
2bee0 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f  ta, nData, nZero
2bef0 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28  , &szNew);.  if(
2bf00 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
2bf10 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  nsert;.  assert(
2bf20 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65   szNew==cellSize
2bf30 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65  Ptr(pPage, newCe
2bf40 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
2bf50 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f   szNew<=MX_CELL_
2bf60 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
2bf70 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52  f( loc==0 && CUR
2bf80 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
2bf90 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 75  >eState ){.    u
2bfa0 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73  16 szOld;.    as
2bfb0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
2bfc0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
2bfd0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2bfe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2bff0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2c000 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c010 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2c020 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2c030 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65  .    }.    oldCe
2c040 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
2c050 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b  age, pCur->idx);
2c060 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2c070 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
2c080 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
2c090 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
2c0a0 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
2c0b0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2c0c0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
2c0d0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2c0e0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2c0f0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2c100 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
2c110 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
2c120 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c   pCur->idx, szOl
2c130 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  d);.  }else if( 
2c140 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e  loc<0 && pPage->
2c150 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61  nCell>0 ){.    a
2c160 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2c170 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  af );.    pCur->
2c180 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d  idx++;.    pCur-
2c190 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2c1a0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
2c1b0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  NKey = 0;.  }els
2c1c0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
2c1d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
2c1e0 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43  }.  rc = insertC
2c1f0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2c200 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73  >idx, newCell, s
2c210 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69  zNew, 0, 0);.  i
2c220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c230 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
2c240 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e  rt;.  rc = balan
2c250 63 65 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  ce(pPage, 1);.  
2c260 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  /* sqlite3BtreeP
2c270 61 67 65 44 75 6d 70 28 70 43 75 72 2d 3e 70 42  ageDump(pCur->pB
2c280 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2c290 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a 20 66  t, 1); */.  /* f
2c2a0 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a  flush(stdout); *
2c2b0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2c2c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
2c2d0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2c2e0 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20   }.end_insert:. 
2c2f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c300 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
2c310 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63  entry that the c
2c320 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
2c330 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  g to.  The curso
2c340 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
2c350 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f  nting at a rando
2c360 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69  m location..*/.i
2c370 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
2c380 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a  elete(BtCursor *
2c390 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2c3a0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2c3b0 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67 6e 65  pPage;.  unsigne
2c3c0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
2c3d0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
2c3e0 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20  pgnoChild = 0;. 
2c3f0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
2c400 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
2c410 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2c420 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
2c430 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2c440 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c450 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2c460 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
2c470 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2c480 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2c490 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2c4a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66   transaction bef
2c4b0 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65  ore doing a dele
2c4c0 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  te */.    rc = p
2c4d0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2c4e0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2c4f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c500 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c510 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2c520 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2c530 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2c540 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
2c550 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
2c560 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69  r->skip;.  }.  i
2c570 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e 3d 20  f( pCur->idx >= 
2c580 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2c590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c5a0 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65  E_ERROR;  /* The
2c5b0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2c5c0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68  ointing to anyth
2c5d0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2c5e0 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29   !pCur->wrFlag )
2c5f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c600 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 44  ITE_PERM;   /* D
2c610 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68 69 73  id not open this
2c620 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72 69 74   cursor for writ
2c630 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2c640 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2c650 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
2c660 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2c670 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ur) ){.    retur
2c680 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2c690 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
2c6a0 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
2c6b0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
2c6c0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72    }..  /* Restor
2c6d0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
2c6e0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61  rsor position (a
2c6f0 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75   no-op if the cu
2c700 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a  rsor is not in .
2c710 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55    ** CURSOR_REQU
2c720 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61  IRESEEK state) a
2c730 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69  nd save the posi
2c740 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
2c750 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a  er cursors .  **
2c760 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2c770 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61  e table. Then ca
2c780 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
2c790 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61  rite() on the pa
2c7a0 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ge.  ** that the
2c7b0 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64   entry will be d
2c7c0 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a  eleted from..  *
2c7d0 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72 63  /.  if( .    (rc
2c7e0 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
2c7f0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2c800 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20  pCur))!=0 ||.   
2c810 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75   (rc = saveAllCu
2c820 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
2c830 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
2c840 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
2c850 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c860 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2c870 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ge))!=0.  ){.   
2c880 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c890 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
2c8a0 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73   cell within its
2c8b0 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20   page and leave 
2c8c0 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74  pCell pointing t
2c8d0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e  o the.  ** data.
2c8e0 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29   The clearCell()
2c8f0 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20   call frees any 
2c900 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2c910 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2c920 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68  he.  ** cell. Th
2c930 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73  e cell itself is
2c940 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20   still intact.. 
2c950 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69   */.  pCell = fi
2c960 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
2c970 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20  ur->idx);.  if( 
2c980 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2c990 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20      pgnoChild = 
2c9a0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
2c9b0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61  .  }.  rc = clea
2c9c0 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
2c9d0 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ll);.  if( rc ){
2c9e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2c9f0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
2ca00 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
2ca10 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74  *.    ** The ent
2ca20 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ry we are about 
2ca30 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
2ca40 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65   a leaf so if we
2ca50 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64   do not.    ** d
2ca60 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77  o something we w
2ca70 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65  ill leave a hole
2ca80 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   on an internal 
2ca90 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  page..    ** We 
2caa0 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  have to fill the
2cab0 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20   hole by moving 
2cac0 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61  in a cell from a
2cad0 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20   leaf.  The.    
2cae0 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74  ** next Cell aft
2caf0 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65  er the one to be
2cb00 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72   deleted is guar
2cb10 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
2cb20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  and.    ** to be
2cb30 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61   a leaf so we ca
2cb40 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
2cb50 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65  .    BtCursor le
2cb60 61 66 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67  afCur;.    unsig
2cb70 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b  ned char *pNext;
2cb80 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  .    int notUsed
2cb90 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2cba0 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20  har *tempCell = 
2cbb0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
2cbc0 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
2cbd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
2cbe0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
2cbf0 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29  (pCur, &leafCur)
2cc00 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2cc10 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61  e3BtreeNext(&lea
2cc20 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b  fCur, &notUsed);
2cc30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2cc40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cc50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2cc60 72 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70  rWrite(leafCur.p
2cc70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2cc80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2cc90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2cca0 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74 3b       u16 szNext;
2ccb0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44  .      TRACE(("D
2ccc0 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2ccd0 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20  delete internal 
2cce0 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20  from %d replace 
2ccf0 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c  from leaf %d\n",
2cd00 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  .         pCur->
2cd10 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
2cd20 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70  >pgno, leafCur.p
2cd30 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2cd40 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2cd50 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63  ge, pCur->idx, c
2cd60 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2cd70 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
2cd80 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
2cd90 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2cda0 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a 20   leafCur.idx);. 
2cdb0 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
2cdc0 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43 75  llSizePtr(leafCu
2cdd0 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  r.pPage, pNext);
2cde0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2cdf0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2ce00 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2ce10 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
2ce20 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
2ce30 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74    tempCell = pBt
2ce40 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
2ce50 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d     if( tempCell=
2ce60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2ce70 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2ce80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ce90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cea0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2ceb0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2cec0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70 4e  e, pCur->idx, pN
2ced0 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c  ext-4, szNext+4,
2cee0 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20   tempCell, 0);. 
2cef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2cf00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cf10 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
2cf20 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2cf30 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2cf40 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64  >idx), pgnoChild
2cf50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2cf60 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30  balance(pPage, 0
2cf70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2cf80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cf90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 64 72  OK ){.        dr
2cfa0 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70  opCell(leafCur.p
2cfb0 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64  Page, leafCur.id
2cfc0 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20  x, szNext);.    
2cfd0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2cfe0 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2cff0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2d000 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
2d010 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
2d020 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20  sor(&leafCur);. 
2d030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43   }else{.    TRAC
2d040 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2d050 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d  e=%d delete from
2d060 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2d070 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2d080 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ot, pPage->pgno)
2d090 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  );.    dropCell(
2d0a0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2d0b0 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
2d0c0 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
2d0d0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2d0e0 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Page, 0);.  }.  
2d0f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d100 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2d110 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
2d120 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d130 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2d140 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2d150 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2d160 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2d170 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2d180 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2d190 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2d1a0 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2d1b0 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2d1c0 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2d1d0 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2d1e0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2d1f0 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2d200 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2d210 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2d220 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2d230 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2d240 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2d250 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2d260 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2d270 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2d280 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2d290 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2d2a0 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2d2b0 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2d2c0 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61  L indices.*/.sta
2d2d0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65  tic int btreeCre
2d2e0 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2d2f0 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2d300 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2d310 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2d320 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2d330 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2d340 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2d350 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
2d360 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2d370 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
2d380 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2d390 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2d3a0 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2d3b0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2d3c0 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20  tion first */.  
2d3d0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2d3e0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2d3f0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2d400 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2d410 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2d420 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2d430 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ly );..#ifdef SQ
2d440 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2d450 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  CUUM.  rc = allo
2d460 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2d470 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2d480 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69  Root, 1, 0);.  i
2d490 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2d4a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73  urn rc;.  }.#els
2d4b0 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  e.  if( pBt->aut
2d4c0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
2d4d0 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20  gno pgnoMove;   
2d4e0 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67     /* Move a pag
2d4f0 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72  e here to make r
2d500 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  oom for the root
2d510 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  -page */.    Mem
2d520 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b  Page *pPageMove;
2d530 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2d540 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20  move to. */..   
2d550 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e   /* Creating a n
2d560 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f  ew table may pro
2d570 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f  bably require mo
2d580 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  ving an existing
2d590 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2d5a0 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2d5b0 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  r the new tables
2d5c0 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63   root page. In c
2d5d0 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75  ase this page tu
2d5e0 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  rns.    ** out t
2d5f0 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  o be an overflow
2d600 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c   page, delete al
2d610 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  l overflow page-
2d620 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a  map caches.    *
2d630 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63  * held by open c
2d640 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  ursors..    */. 
2d650 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
2d660 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
2d670 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  t);..    /* Read
2d680 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
2d690 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64  ta[3] from the d
2d6a0 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72  atabase to deter
2d6b0 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20  mine where the. 
2d6c0 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
2d6d0 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
2d6e0 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61   should go. meta
2d6f0 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65  [3] is the large
2d700 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2d710 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66   ** created so f
2d720 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72  ar, so the new r
2d730 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74  oot-page is (met
2d740 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a  a[3]+1)..    */.
2d750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d760 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
2d770 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  4, &pgnoRoot);. 
2d780 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2d7a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2d7b0 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a     pgnoRoot++;..
2d7c0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
2d7d0 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74  oot-page may not
2d7e0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e   be allocated on
2d7f0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2d800 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  age, or the.    
2d810 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
2d820 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2d830 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74   while( pgnoRoot
2d840 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
2d850 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c  pBt, pgnoRoot) |
2d860 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f  |.        pgnoRo
2d870 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ot==PENDING_BYTE
2d880 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2d890 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2d8a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2d8b0 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b  ( pgnoRoot>=3 );
2d8c0 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
2d8d0 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61  e a page. The pa
2d8e0 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  ge that currentl
2d8f0 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e  y resides at pgn
2d900 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a  oRoot will.    *
2d910 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  * be moved to th
2d920 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2d930 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c   (unless the all
2d940 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70  ocated page happ
2d950 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65  ens.    ** to re
2d960 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  side at pgnoRoot
2d970 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2d980 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2d990 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65  Page(pBt, &pPage
2d9a0 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c  Move, &pgnoMove,
2d9b0 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20   pgnoRoot, 1);. 
2d9c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d9d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2d9e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2d9f0 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65      if( pgnoMove
2da00 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  !=pgnoRoot ){.  
2da10 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20      /* pgnoRoot 
2da20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
2da30 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
2da40 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
2da50 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
2da60 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d  new table (assum
2da70 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64  ing an error did
2da80 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74   not occur). But
2da90 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a   we were.      *
2daa0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f  * allocated pgno
2dab0 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65  Move. If require
2dac0 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61  d (i.e. if it wa
2dad0 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a  s not allocated.
2dae0 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65        ** by exte
2daf0 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c  nding the file),
2db00 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2db10 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67  e at position pg
2db20 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20  noMove.      ** 
2db30 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e  is already journ
2db40 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  aled..      */. 
2db50 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2db60 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
2db70 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
2db80 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
2db90 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76  );..      /* Mov
2dba0 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  e the page curre
2dbb0 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ntly at pgnoRoot
2dbc0 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f   to pgnoMove. */
2dbd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2dbe0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2dbf0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
2dc00 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
2dc10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2dc20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2dc30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2dc40 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2dc50 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52  apGet(pBt, pgnoR
2dc60 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50  oot, &eType, &iP
2dc70 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  trPage);.      i
2dc80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2dc90 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2dca0 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
2dcb0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2dcc0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2dcd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2dce0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2dcf0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2dd00 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2dd10 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
2dd20 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AGE );.      ass
2dd30 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
2dd40 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20  AP_FREEPAGE );. 
2dd50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2dd60 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
2dd70 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
2dd80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2dd90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2dda0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2ddb0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2ddc0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2ddd0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
2dde0 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f  tePage(pBt, pRoo
2ddf0 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  t, eType, iPtrPa
2de00 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29 3b 0a 20  ge, pgnoMove);. 
2de10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2de20 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20  (pRoot);..      
2de30 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61  /* Obtain the pa
2de40 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a  ge at pgnoRoot *
2de50 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  /.      if( rc!=
2de60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2de70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2de80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2de90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2dea0 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
2deb0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
2dec0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ded0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dee0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2def0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
2df00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2df10 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
2df20 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2df30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2df40 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2df50 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20  Page(pRoot);.   
2df60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2df70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2df80 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  e{.      pRoot =
2df90 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20   pPageMove;.    
2dfa0 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  } ..    /* Updat
2dfb0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  e the pointer-ma
2dfc0 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20  p and meta-data 
2dfd0 77 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f  with the new roo
2dfe0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a  t-page number. *
2dff0 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  /.    rc = ptrma
2e000 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pPut(pBt, pgnoRo
2e010 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  ot, PTRMAP_ROOTP
2e020 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  AGE, 0);.    if(
2e030 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
2e040 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2e050 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2e070 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
2e080 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67  ateMeta(p, 4, pg
2e090 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
2e0a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c   rc ){.      rel
2e0b0 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2e0c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e0d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
2e0e0 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  {.    rc = alloc
2e0f0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2e100 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
2e110 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  oot, 1, 0);.    
2e120 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2e130 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rc;.  }.#endif. 
2e140 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e150 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2e160 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2e170 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
2e180 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54  Root, flags | PT
2e190 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74  F_LEAF);.  sqlit
2e1a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f  e3PagerUnref(pRo
2e1b0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
2e1c0 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29  *piTable = (int)
2e1d0 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75  pgnoRoot;.  retu
2e1e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2e1f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2e200 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
2e210 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
2e220 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
2e230 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2e240 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
2e250 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d  ;.  p->pBt->db =
2e260 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62   p->db;.  rc = b
2e270 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
2e280 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67  p, piTable, flag
2e290 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
2e2a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
2e2b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e2c0 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
2e2d0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
2e2e0 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
2e2f0 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
2e300 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
2e310 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
2e320 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
2e330 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74  tabasePage(.  Bt
2e340 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2e350 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2e360 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ree that contain
2e370 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
2e380 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
2e390 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2e3a0 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a  umber to clear *
2e3b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2e3c0 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
2e3d0 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20  ent page.  NULL 
2e3e0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a  for the root */.
2e3f0 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
2e400 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag      /* Deall
2e410 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
2e420 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ue */.){.  MemPa
2e430 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
2e440 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
2e450 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2e460 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
2e470 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2e480 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2e490 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
2e4a0 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o>sqlite3PagerPa
2e4b0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
2e4c0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
2e4d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2e4e0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72  T_BKPT;.  }..  r
2e4f0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
2e500 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70  ge(pBt, pgno, &p
2e510 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a  Page, pParent);.
2e520 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2e530 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2e540 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30  e_out;.  for(i=0
2e550 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
2e560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c  ; i++){.    pCel
2e570 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2e580 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ge, i);.    if( 
2e590 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e5a0 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72        rc = clear
2e5b0 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74  DatabasePage(pBt
2e5c0 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
2e5d0 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  ), pPage->pParen
2e5e0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 1);.      if(
2e5f0 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2e600 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2e610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2e620 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2e630 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
2e640 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2e650 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2e660 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  t;.  }.  if( !pP
2e670 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e680 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
2e690 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
2e6a0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2e6b0 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e  ata[8]), pPage->
2e6c0 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20  pParent, 1);.   
2e6d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2e6e0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2e6f0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
2e700 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a  freePageFlag ){.
2e710 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2e720 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
2e730 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69  e if( (rc = sqli
2e740 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2e750 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d  age->pDbPage))==
2e760 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67  0 ){.    zeroPag
2e770 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
2e780 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c  aData[0] | PTF_L
2e790 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72  EAF);.  }..clear
2e7a0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2e7b0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
2e7c0 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
2e7d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
2e7e0 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  lete all informa
2e7f0 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67  tion from a sing
2e800 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
2e810 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c  database.  iTabl
2e820 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  e is.** the page
2e830 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
2e840 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
2e850 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
2e860 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a  utine returns,.*
2e870 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
2e880 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74  is empty, but st
2e890 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a  ill exists..**.*
2e8a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2e8b0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
2e8c0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
2e8d0 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
2e8e0 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72  n.** read cursor
2e8f0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s on the table. 
2e900 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73   Open write curs
2e910 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  ors are moved to
2e920 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20   the.** root of 
2e930 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  the table..*/.in
2e940 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
2e950 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a  earTable(Btree *
2e960 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2e970 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
2e980 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2e990 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
2e9a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
2e9b0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
2e9c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2e9d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2e9e0 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2e9f0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2ea00 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2ea10 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
2ea20 20 69 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b   if( (rc = check
2ea30 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61  ReadLocks(p, iTa
2ea40 62 6c 65 2c 20 30 29 29 21 3d 53 51 4c 49 54 45  ble, 0))!=SQLITE
2ea50 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  _OK ){.    /* no
2ea60 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
2ea70 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
2ea80 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
2ea90 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
2eaa0 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20  iTable, 0)) ){. 
2eab0 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
2eac0 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
2ead0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2eae0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2eaf0 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
2eb00 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
2eb10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2eb20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2eb30 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
2eb40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
2eb50 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20  a table and add 
2eb60 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
2eb70 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20  table to.** the 
2eb80 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70  freelist.  Excep
2eb90 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  t, the root of t
2eba0 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62  he principle tab
2ebb0 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a  le (the one on.*
2ebc0 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76  * page 1) is nev
2ebd0 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  er added to the 
2ebe0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
2ebf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
2ec00 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
2ec10 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
2ec20 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
2ec30 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ** cursors on th
2ec40 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
2ec50 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
2ec60 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  enabled and the 
2ec70 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69  page at iTable i
2ec80 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a  s not the last.*
2ec90 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  * root page in t
2eca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ecb0 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
2ecc0 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e  root page .** in
2ecd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ece0 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f  le is moved into
2ecf0 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72   the slot former
2ed00 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a  ly occupied by.*
2ed10 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61  * iTable and tha
2ed20 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d  t last slot form
2ed30 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
2ed40 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
2ed50 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  age.** is added 
2ed60 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
2ed70 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c  instead of iTabl
2ed80 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c  e.  In this say,
2ed90 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   all.** root pag
2eda0 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74  es are kept at t
2edb0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
2edc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2edd0 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e  e, which.** is n
2ede0 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54  ecessary for AUT
2edf0 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20  OVACUUM to work 
2ee00 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64  right.  *piMoved
2ee10 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a   is set to the .
2ee20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ** page number t
2ee30 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74  hat used to be t
2ee40 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2ee50 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65  e in the file be
2ee60 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65  fore.** the move
2ee70 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65  .  If no page ge
2ee80 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76  ts moved, *piMov
2ee90 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ed is set to 0..
2eea0 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74  ** The last root
2eeb0 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65   page is recorde
2eec0 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64  d in meta[3] and
2eed0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
2eee0 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61   meta[3] is upda
2eef0 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ted by this proc
2ef00 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  edure..*/.static
2ef10 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61   int btreeDropTa
2ef20 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2ef30 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
2ef40 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
2ef50 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2ef60 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  age = 0;.  BtSha
2ef70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2ef80 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
2ef90 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2efa0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28  utex(p) );.  if(
2efb0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
2efc0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2efd0 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
2efe0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2eff0 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2f000 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
2f010 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
2f020 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69  o drop a table i
2f030 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72  f any cursors ar
2f040 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20  e open on the.  
2f050 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
2f060 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
2f070 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
2f080 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79   the backend may
2f090 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f  .  ** need to mo
2f0a0 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d  ve another root-
2f0b0 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67  page to fill a g
2f0c0 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
2f0d0 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74  eleted.  ** root
2f0e0 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65   page. If an ope
2f0f0 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69  n cursor was usi
2f100 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70  ng this page a p
2f110 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20  roblem would .  
2f120 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20  ** occur..  */. 
2f130 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
2f140 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
2f150 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
2f160 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
2f170 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2f180 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
2f190 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
2f1a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2f1b0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
2f1c0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
2f1d0 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  e(p, iTable);.  
2f1e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2f1f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2f200 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2f210 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
2f220 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
2f230 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
2f240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2f250 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
2f260 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2f270 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2f280 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
2f290 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2f2a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
2f2b0 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
2f2c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2f2d0 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
2f2e0 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50  (p, 4, &maxRootP
2f2f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2f300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f310 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2f320 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2f330 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f340 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2f350 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f  f( iTable==maxRo
2f360 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  otPgno ){.      
2f370 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
2f380 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
2f390 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  is the table wit
2f3a0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  h the largest ro
2f3b0 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
2f3c0 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ** number in the
2f3d0 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74   database, put t
2f3e0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20  he root page on 
2f3f0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a  the free list. .
2f400 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f410 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2f420 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2f430 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2f440 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2f450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f460 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2f470 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2f480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2f4a0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
2f4b0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
2f4c0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
2f4d0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2f4e0 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61  number in the da
2f4f0 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20  tabase. So move 
2f500 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f  the page that do
2f510 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  es into the .   
2f520 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74       ** gap left
2f530 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20   by the deleted 
2f540 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20  root-page..     
2f550 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65     */.        Me
2f560 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20  mPage *pMove;.  
2f570 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f580 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2f590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f5a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2f5b0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
2f5c0 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
2f5d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f5e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f5f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2f610 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
2f620 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41  Bt, pMove, PTRMA
2f630 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69  P_ROOTPAGE, 0, i
2f640 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  Table);.        
2f650 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76  releasePage(pMov
2f660 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2f670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f680 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2f690 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2f6a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f6b0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2f6c0 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
2f6d0 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20  o, &pMove, 0);. 
2f6e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2f6f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f700 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f710 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f720 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2f730 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
2f740 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f   releasePage(pMo
2f750 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ve);.        if(
2f760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f770 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2f780 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2f790 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65  .        *piMove
2f7a0 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b  d = maxRootPgno;
2f7b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2f7c0 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27  /* Set the new '
2f7d0 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76  max-root-page' v
2f7e0 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61  alue in the data
2f7f0 62 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69  base header. Thi
2f800 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  s.      ** is th
2f810 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73  e old value less
2f820 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d   one, less one m
2f830 6f 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70  ore if that happ
2f840 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ens to.      ** 
2f850 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e  be a root-page n
2f860 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20  umber, less one 
2f870 61 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 73  again if that is
2f880 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45   the.      ** PE
2f890 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e  NDING_BYTE_PAGE.
2f8a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f8b0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
2f8c0 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74       if( maxRoot
2f8d0 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
2f8e0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2f8f0 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
2f900 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
2f910 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74       if( maxRoot
2f920 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47  Pgno==PTRMAP_PAG
2f930 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  ENO(pBt, maxRoot
2f940 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Pgno) ){.       
2f950 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
2f960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2f970 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e  sert( maxRootPgn
2f980 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
2f990 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20  PAGE(pBt) );..  
2f9a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f9b0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
2f9c0 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  p, 4, maxRootPgn
2f9d0 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  o);.    }else{. 
2f9e0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2f9f0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2fa00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2fa10 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
2fa20 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
2fa30 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65  * If sqlite3Btre
2fa40 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63  eDropTable was c
2fa50 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e  alled on page 1.
2fa60 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   */.    zeroPage
2fa70 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b  (pPage, PTF_INTK
2fa80 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20  EY|PTF_LEAF );. 
2fa90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2faa0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
2fab0 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20  urn rc;  .}.int 
2fac0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
2fad0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
2fae0 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
2faf0 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  *piMoved){.  int
2fb00 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
2fb10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
2fb20 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64  ->pBt->db = p->d
2fb30 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44  b;.  rc = btreeD
2fb40 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62  ropTable(p, iTab
2fb50 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20  le, piMoved);.  
2fb60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2fb70 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
2fb80 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
2fb90 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72  d the meta-infor
2fba0 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20  mation out of a 
2fbb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
2fbc0 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68  Meta[0].** is th
2fbd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
2fbe0 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
2fbf0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fc00 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68  .  Meta[1].** th
2fc10 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61  rough meta[15] a
2fc20 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  re available for
2fc30 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c   use by higher l
2fc40 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a  ayers.  Meta[0].
2fc50 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  ** is read-only,
2fc60 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20   the others are 
2fc70 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a  read/write..** .
2fc80 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61  ** The schema la
2fc90 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61  yer numbers meta
2fca0 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e   values differen
2fcb0 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68  tly.  At the sch
2fcc0 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e  ema.** layer (an
2fcd0 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20  d the SetCookie 
2fce0 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f  and ReadCookie o
2fcf0 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62  pcodes) the numb
2fd00 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61  er of.** free pa
2fd10 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62  ges is not visib
2fd20 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30  le.  So Cookie[0
2fd30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  ] is the same as
2fd40 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74   Meta[1]..*/.int
2fd50 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2fd60 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69  Meta(Btree *p, i
2fd70 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65  nt idx, u32 *pMe
2fd80 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  ta){.  DbPage *p
2fd90 44 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  DbPage;.  int rc
2fda0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2fdb0 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72  r *pP1;.  BtShar
2fdc0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2fdd0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
2fde0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
2fdf0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20  ->db = p->db;.. 
2fe00 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65   /* Reading a me
2fe10 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65  ta-data value re
2fe20 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
2fe30 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e  ck on page 1 (an
2fe40 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65  d hence.  ** the
2fe50 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
2fe60 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68  able. We grab th
2fe70 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65  is lock regardle
2fe80 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2fe90 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51  .  ** not the SQ
2fea0 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
2feb0 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
2fec0 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74   (the table root
2fed0 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20  ed at page.  ** 
2fee0 31 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20  1 is treated as 
2fef0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62  a special case b
2ff00 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  y queryTableLock
2ff10 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65  () and lockTable
2ff20 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ())..  */.  rc =
2ff30 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
2ff40 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2ff50 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2ff60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2ff70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
2ff80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2ff90 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
2ffa0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d   idx>=0 && idx<=
2ffb0 31 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  15 );.  rc = sql
2ffc0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
2ffd0 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44  ->pPager, 1, &pD
2ffe0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2fff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
30000 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
30010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
30020 0a 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e  .  pP1 = (unsign
30030 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
30040 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
30050 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61  bPage);.  *pMeta
30060 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31   = get4byte(&pP1
30070 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20  [36 + idx*4]);. 
30080 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
30090 65 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ef(pDbPage);..  
300a0 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
300b0 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
300c0 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
300d0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
300e0 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
300f0 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
30100 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
30110 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
30120 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
30130 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
30140 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30150 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
30160 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
30170 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
30180 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  if..  /* Grab th
30190 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  e read-lock on p
301a0 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d  age 1. */.  rc =
301b0 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c   lockTable(p, 1,
301c0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73   READ_LOCK);.  s
301d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
301e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
301f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
30200 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
30210 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
30220 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
30230 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e  0] is.** read-on
30240 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62  ly and may not b
30250 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e  e written..*/.in
30260 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  t sqlite3BtreeUp
30270 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a  dateMeta(Btree *
30280 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
30290 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72  iMeta){.  BtShar
302a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
302b0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
302c0 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63  r *pP1;.  int rc
302d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ;.  assert( idx>
302e0 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =1 && idx<=15 );
302f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
30300 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
30310 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
30320 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
30330 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
30340 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
30350 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
30360 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
30370 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
30380 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
30390 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 20  pPage1!=0 );.   
303a0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
303b0 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
303c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
303d0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
303e0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
303f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30400 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  OK ){.      put4
30410 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69  byte(&pP1[36 + i
30420 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23  dx*4], iMeta);.#
30430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30440 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30450 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29      if( idx==7 )
30460 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
30470 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
30480 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b  m || iMeta==0 );
30490 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
304a0 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65   iMeta==0 || iMe
304b0 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  ta==1 );.       
304c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
304d0 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20   = iMeta;.      
304e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
304f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
30500 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
30510 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30520 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67   Return the flag
30530 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67   byte at the beg
30540 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61  inning of the pa
30550 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ge that the curs
30560 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  or.** is current
30570 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  ly pointing to..
30580 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
30590 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f  reeFlags(BtCurso
305a0 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
305b0 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20  ODO: What about 
305c0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
305d0 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62  EK state? Probab
305e0 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a  ly need to call.
305f0 20 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c    ** restoreOrCl
30600 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
30610 6e 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  n() here..  */. 
30620 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
30630 0a 20 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  .  restoreOrClea
30640 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
30650 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
30660 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
30670 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
30680 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
30690 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
306a0 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42  e->pBt==pCur->pB
306b0 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  t );.  return pP
306c0 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61  age ? pPage->aDa
306d0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
306e0 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a  set] : 0;.}.../*
306f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
30700 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
30710 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54  with a BTree.  T
30720 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
30730 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
30740 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
30750 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20   only..*/.Pager 
30760 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  *sqlite3BtreePag
30770 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  er(Btree *p){.  
30780 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
30790 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65  Pager;.}..#ifnde
307a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
307b0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
307c0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73  .** Append a mes
307d0 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f  sage to the erro
307e0 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
307f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30800 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
30810 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
30820 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a  pCheck,.  char *
30830 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zMsg1,.  const c
30840 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20  har *zFormat,.  
30850 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74  ....){.  va_list
30860 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   ap;.  char *zMs
30870 67 32 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63  g2;.  if( !pChec
30880 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72  k->mxErr ) retur
30890 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45  n;.  pCheck->mxE
308a0 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  rr--;.  pCheck->
308b0 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61  nErr++;.  va_sta
308c0 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
308d0 0a 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74  .  zMsg2 = sqlit
308e0 65 33 56 4d 50 72 69 6e 74 66 28 30 2c 20 7a 46  e3VMPrintf(0, zF
308f0 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
30900 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
30910 7a 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31  zMsg1==0 ) zMsg1
30920 20 3d 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68   = "";.  if( pCh
30930 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  eck->zErrMsg ){.
30940 20 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d      char *zOld =
30950 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
30960 3b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45  ;.    pCheck->zE
30970 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73  rrMsg = 0;.    s
30980 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
30990 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67  &pCheck->zErrMsg
309a0 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d  , zOld, "\n", zM
309b0 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61  sg1, zMsg2, (cha
309c0 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r*)0);.    sqlit
309d0 65 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20  e3_free(zOld);. 
309e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
309f0 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43  te3SetString(&pC
30a00 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a  heck->zErrMsg, z
30a10 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68  Msg1, zMsg2, (ch
30a20 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71  ar*)0);.  }.  sq
30a30 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 32  lite3_free(zMsg2
30a40 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
30a50 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
30a60 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
30a70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30a80 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
30a90 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74  CK./*.** Add 1 t
30aa0 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  o the reference 
30ab0 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69  count for page i
30ac0 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69  Page.  If this i
30ad0 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
30ae0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
30af0 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72   page, add an er
30b00 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
30b10 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Check->zErrMsg..
30b20 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
30b30 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d  here are 2 ore m
30b40 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
30b50 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30  o the page and 0
30b60 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69   if.** if this i
30b70 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65  s the first refe
30b80 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
30b90 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68  e..**.** Also ch
30ba0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
30bb0 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62  e number is in b
30bc0 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ounds..*/.static
30bd0 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e   int checkRef(In
30be0 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
30bf0 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68  k, int iPage, ch
30c00 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20  ar *zContext){. 
30c10 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
30c20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
30c30 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50  iPage>pCheck->nP
30c40 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29  age || iPage<0 )
30c50 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
30c60 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
30c70 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20  ntext, "invalid 
30c80 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c  page number %d",
30c90 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
30ca0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
30cb0 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69   pCheck->anRef[i
30cc0 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20  Page]==1 ){.    
30cd0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30ce0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30cf0 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20   "2nd reference 
30d00 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  to page %d", iPa
30d10 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
30d20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
30d30 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b   (pCheck->anRef[
30d40 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a  iPage]++)>1;.}..
30d50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30d60 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
30d70 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
30d80 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  the entry in the
30d90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72   pointer-map for
30da0 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70   page iChild map
30db0 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50  s to .** page iP
30dc0 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74  arent, pointer t
30dd0 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20  ype ptrType. If 
30de0 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65  not, append an e
30df0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
30e00 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74  to pCheck..*/.st
30e10 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
30e20 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69  trmap(.  Integri
30e30 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20  tyCk *pCheck,   
30e40 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
30e50 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ck context */.  
30e60 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
30e70 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20         /* Child 
30e80 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
30e90 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
30ea0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
30eb0 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
30ec0 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  type */.  Pgno i
30ed0 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
30ee0 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
30ef0 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20  nter map parent 
30f00 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
30f10 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
30f20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
30f30 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28  xt description (
30f40 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
30f50 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sg) */.){.  int 
30f60 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70  rc;.  u8 ePtrmap
30f70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Type;.  Pgno iPt
30f80 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72  rmapParent;..  r
30f90 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43  c = ptrmapGet(pC
30fa0 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c  heck->pBt, iChil
30fb0 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c  d, &ePtrmapType,
30fc0 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29   &iPtrmapParent)
30fd0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
30fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65  TE_OK ){.    che
30ff0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31000 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46  ck, zContext, "F
31010 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74  ailed to read pt
31020 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43  rmap key=%d", iC
31030 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
31040 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50  n;.  }..  if( eP
31050 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65  trmapType!=eType
31060 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e   || iPtrmapParen
31070 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20  t!=iParent ){.  
31080 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
31090 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
310a0 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70  t, .      "Bad p
310b0 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79  tr map entry key
310c0 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64  =%d expected=(%d
310d0 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29  ,%d) got=(%d,%d)
310e0 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64  ", .      iChild
310f0 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74  , eType, iParent
31100 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69  , ePtrmapType, i
31110 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
31120 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
31130 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  ** Check the int
31140 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
31150 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20  eelist or of an 
31160 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
31170 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  st..** Verify th
31180 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
31190 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69   pages on the li
311a0 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74  st is N..*/.stat
311b0 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73  ic void checkLis
311c0 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  t(.  IntegrityCk
311d0 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e   *pCheck,  /* In
311e0 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67  tegrity checking
311f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
31200 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20  t isFreeList,   
31210 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
31220 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c  a freelist.  Fal
31230 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20  se for overflow 
31240 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69  page list */.  i
31250 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
31260 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
31270 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61  ber for first pa
31280 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  ge in the list *
31290 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
312a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
312b0 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
312c0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
312d0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t */.  char *zCo
312e0 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20  ntext        /* 
312f0 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  Context for erro
31300 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b  r messages */.){
31310 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
31320 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20  expected = N;.  
31330 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61  int iFirst = iPa
31340 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ge;.  while( N--
31350 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e   > 0 && pCheck->
31360 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50  mxErr ){.    DbP
31370 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a  age *pOvflPage;.
31380 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
31390 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20  r *pOvflData;.  
313a0 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b    if( iPage<1 ){
313b0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
313c0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
313d0 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
313e0 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73   "%d of %d pages
313f0 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76   missing from ov
31400 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72  erflow list star
31410 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20  ting at %d",.   
31420 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65         N+1, expe
31430 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20  cted, iFirst);. 
31440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31450 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
31460 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
31470 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72  , zContext) ) br
31480 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  eak;.    if( sql
31490 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68  ite3PagerGet(pCh
314a0 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67  eck->pPager, (Pg
314b0 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c  no)iPage, &pOvfl
314c0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63  Page) ){.      c
314d0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
314e0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
314f0 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70  "failed to get p
31500 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
31510 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
31520 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74    }.    pOvflDat
31530 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
31540 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
31550 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61  rGetData(pOvflPa
31560 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46  ge);.    if( isF
31570 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  reeList ){.     
31580 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74   int n = get4byt
31590 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29  e(&pOvflData[4])
315a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
315b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
315c0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
315d0 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
315e0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
315f0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
31600 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
31610 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
31620 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
31630 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
31640 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e   n>pCheck->pBt->
31650 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29  usableSize/4-8 )
31660 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
31670 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
31680 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
31690 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20        "freelist 
316a0 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62  leaf count too b
316b0 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20  ig on page %d", 
316c0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
316d0 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  N--;.      }else
316e0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
316f0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
31700 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
31710 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  eePage = get4byt
31720 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69  e(&pOvflData[8+i
31730 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  *4]);.#ifndef SQ
31740 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31750 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69  CUUM.          i
31760 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
31770 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31780 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50            checkP
31790 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46  trmap(pCheck, iF
317a0 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  reePage, PTRMAP_
317b0 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
317c0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
317d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
317e0 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43       checkRef(pC
317f0 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
31800 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
31810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20      }.        N 
31820 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -= n;.      }.  
31830 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
31840 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31850 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UM.    else{.   
31860 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61     /* If this da
31870 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
31880 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20  auto-vacuum and 
31890 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65  iPage is not the
318a0 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70   last.      ** p
318b0 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72  age in this over
318c0 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b  flow list, check
318d0 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
318e0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r-map entry for.
318f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
31900 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63  lowing page matc
31910 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20  hes iPage..     
31920 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
31930 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
31940 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a  acuum && N>0 ){.
31950 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34          i = get4
31960 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
31970 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
31980 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20  rmap(pCheck, i, 
31990 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
319a0 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
319b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
319c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61  }.#endif.    iPa
319d0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  ge = get4byte(pO
319e0 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71  vflData);.    sq
319f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
31a00 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a  pOvflPage);.  }.
31a10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
31a20 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
31a30 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
31a40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31a50 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
31a60 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73  /*.** Do various
31a70 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f   sanity checks o
31a80 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  n a single page 
31a90 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75  of a tree.  Retu
31aa0 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64  rn.** the tree d
31ab0 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65  epth.  Root page
31ac0 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72  s return 0.  Par
31ad0 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67  ents of root pag
31ae0 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20  es.** return 1, 
31af0 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  and so forth..**
31b00 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b   .** These check
31b10 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a  s are done:.**.*
31b20 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20  *      1.  Make 
31b30 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20  sure that cells 
31b40 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64  and freeblocks d
31b50 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a  o not overlap.**
31b60 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f            but co
31b70 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74  mbine to complet
31b80 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61  ely cover the pa
31b90 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20  ge..**  NO  2.  
31ba0 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b  Make sure cell k
31bb0 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72  eys are in order
31bc0 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61  ..**  NO  3.  Ma
31bd0 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
31be0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
31bf0 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f  qual to zLowerBo
31c00 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20  und..**  NO  4. 
31c10 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
31c20 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  y is greater tha
31c30 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55  n or equal to zU
31c40 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20  pperBound..**   
31c50 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65     5.  Check the
31c60 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76   integrity of ov
31c70 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
31c80 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73        6.  Recurs
31c90 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b  ively call check
31ca0 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20  TreePage on all 
31cb0 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20  children..**    
31cc0 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61    7.  Verify tha
31cd0 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61  t the depth of a
31ce0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74  ll children is t
31cf0 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20  he same..**     
31d00 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   8.  Make sure t
31d10 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c  his page is at l
31d20 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72  east 33% full or
31d30 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20   else it is.**  
31d40 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74          the root
31d50 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f   of the tree..*/
31d60 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
31d70 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74  kTreePage(.  Int
31d80 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
31d90 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f  ,  /* Context fo
31da0 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  r the sanity che
31db0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  ck */.  int iPag
31dc0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
31dd0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
31de0 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63  the page to chec
31df0 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  k */.  MemPage *
31e00 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
31e10 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  Parent page */. 
31e20 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
31e30 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74  ntext  /* Parent
31e40 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
31e50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
31e60 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65  .  int i, rc, de
31e70 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63  pth, d2, pgno, c
31e80 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63  nt;.  int hdr, c
31e90 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20  ellStart;.  int 
31ea0 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74  nCell;.  u8 *dat
31eb0 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
31ec0 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  Bt;.  int usable
31ed0 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f  Size;.  char zCo
31ee0 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68  ntext[100];.  ch
31ef0 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69  ar *hit;..  sqli
31f00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
31f10 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
31f20 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25  Context, "Page %
31f30 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20  d: ", iPage);.. 
31f40 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
31f50 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20  he page exists. 
31f60 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65   */.  pBt = pChe
31f70 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c  ck->pBt;.  usabl
31f80 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
31f90 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69  bleSize;.  if( i
31fa0 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
31fb0 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52   0;.  if( checkR
31fc0 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
31fd0 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74  , zParentContext
31fe0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
31ff0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
32000 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
32010 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20  t, (Pgno)iPage, 
32020 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29  &pPage, 0))!=0 )
32030 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
32040 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
32050 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75  ntext,.       "u
32060 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65  nable to get the
32070 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64   page. error cod
32080 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e=%d", rc);.    
32090 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
320a0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
320b0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
320c0 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21  Page, pParent))!
320d0 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
320e0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
320f0 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
32100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32110 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
32120 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65  Page() returns e
32130 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72  rror code %d", r
32140 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  c);.    releaseP
32150 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
32160 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
32170 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c   /* Check out al
32180 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a  l the cells..  *
32190 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20  /.  depth = 0;. 
321a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
321b0 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65  e->nCell && pChe
321c0 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  ck->mxErr; i++){
321d0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  .    u8 *pCell;.
321e0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
321f0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
32200 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79      /* Check pay
32210 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  load overflow pa
32220 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ges.    */.    s
32230 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32240 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
32250 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
32260 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65           "On tre
32270 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25  e page %d cell %
32280 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b  d: ", iPage, i);
32290 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
322a0 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a  dCell(pPage,i);.
322b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
322c0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
322d0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
322e0 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f  );.    sz = info
322f0 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  .nData;.    if( 
32300 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
32310 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79   sz += info.nKey
32320 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
32330 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
32340 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e  );.    if( sz>in
32350 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
32360 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28     int nPage = (
32370 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  sz - info.nLocal
32380 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   + usableSize - 
32390 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d  5)/(usableSize -
323a0 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20   4);.      Pgno 
323b0 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
323c0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
323d0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66  iOverflow]);.#if
323e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
323f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32400 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
32410 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
32420 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
32430 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  eck, pgnoOvfl, P
32440 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
32450 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
32460 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
32470 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73  f.      checkLis
32480 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e  t(pCheck, 0, pgn
32490 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43  oOvfl, nPage, zC
324a0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a  ontext);.    }..
324b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e      /* Check san
324c0 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c  ity of left chil
324d0 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  d page..    */. 
324e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
324f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  eaf ){.      pgn
32500 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
32510 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
32520 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32530 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
32540 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
32550 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
32560 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
32570 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
32580 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
32590 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
325a0 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65  f.      d2 = che
325b0 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
325c0 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f  k,pgno,pPage,zCo
325d0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  ntext);.      if
325e0 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70  ( i>0 && d2!=dep
325f0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  th ){.        ch
32600 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32610 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
32620 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68  Child page depth
32630 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20   differs");.    
32640 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20    }.      depth 
32650 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = d2;.    }.  }.
32660 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
32670 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
32680 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
32690 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
326a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
326b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
326c0 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
326d0 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  xt), zContext, .
326e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326f0 20 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64       "On page %d
32700 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a   at right child:
32710 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e   ", iPage);.#ifn
32720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32730 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
32740 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
32750 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  um ){.      chec
32760 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
32770 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
32780 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20  EE, iPage, 0);. 
32790 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
327a0 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
327b0 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67  heck, pgno, pPag
327c0 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
327d0 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
327e0 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
327f0 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
32800 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
32810 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
32820 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
32830 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
32840 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
32850 28 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ( usableSize );.
32860 20 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20    if( hit ){.   
32870 20 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20   memset(hit, 1, 
32880 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
32890 64 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65  dr+5]));.    nCe
328a0 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
328b0 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
328c0 20 63 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72   cellStart = hdr
328d0 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
328e0 3e 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69  >leaf;.    for(i
328f0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
32900 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20  ){.      int pc 
32910 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
32920 5b 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29  [cellStart+i*2])
32930 3b 0a 20 20 20 20 20 20 75 31 36 20 73 69 7a 65  ;.      u16 size
32940 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
32950 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
32960 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
32970 20 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a       if( (pc+siz
32980 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
32990 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20   || pc<0 ){.    
329a0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
329b0 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
329c0 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
329d0 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
329e0 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
329f0 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
32a00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
32a10 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63          for(j=pc
32a20 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20  +size-1; j>=pc; 
32a30 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
32a40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
32a50 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65   for(cnt=0, i=ge
32a60 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
32a70 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75  +1]); i>0 && i<u
32a80 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74  sableSize && cnt
32a90 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20  <10000; .       
32aa0 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20      cnt++){.    
32ab0 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74    int size = get
32ac0 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d  2byte(&data[i+2]
32ad0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
32ae0 20 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a        if( (i+siz
32af0 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
32b00 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20   || i<0 ){.     
32b10 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32b20 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20  g(pCheck, 0,  . 
32b30 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
32b40 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
32b50 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
32b60 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
32b70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
32b80 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
32b90 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d  size-1; j>=i; j-
32ba0 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
32bb0 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67     }.      i = g
32bc0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d  et2byte(&data[i]
32bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
32be0 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62  (i=cnt=0; i<usab
32bf0 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  leSize; i++){.  
32c00 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d      if( hit[i]==
32c10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74  0 ){.        cnt
32c20 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
32c30 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a  if( hit[i]>1 ){.
32c40 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
32c50 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
32c60 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c  ,.          "Mul
32c70 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62  tiple uses for b
32c80 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25  yte %d of page %
32c90 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20  d", i, iPage);. 
32ca0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
32cb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
32cc0 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64  if( cnt!=data[hd
32cd0 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68  r+7] ){.      ch
32ce0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32cf0 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
32d00 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73     "Fragmented s
32d10 70 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20  pace is %d byte 
32d20 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f  reported as %d o
32d30 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20  n page %d",.    
32d40 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b        cnt, data[
32d50 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a  hdr+7], iPage);.
32d60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
32d70 74 65 33 5f 66 72 65 65 28 68 69 74 29 3b 0a 0a  te3_free(hit);..
32d80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
32d90 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  age);.  return d
32da0 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66  epth+1;.}.#endif
32db0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
32dc0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
32dd0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
32de0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
32df0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  Y_CHECK./*.** Th
32e00 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
32e10 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b  a complete check
32e20 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42 54   of the given BT
32e30 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74  ree file.  aRoot
32e40 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61  [] is.** an arra
32e50 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65  y of pages numbe
32e60 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67  rs were each pag
32e70 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  e number is the 
32e80 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
32e90 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20  a table.  nRoot 
32ea0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
32eb0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
32ec0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  t..**.** If ever
32ed0 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75  ything checks ou
32ee0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
32ef0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49  returns NULL.  I
32f00 66 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a  f something is.*
32f10 2a 20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f  * amiss, an erro
32f20 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
32f30 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  tten into memory
32f40 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
32f50 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61  alloc().** and a
32f60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74   pointer to that
32f70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
32f80 73 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65  s returned.  The
32f90 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
32fa0 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
32fb0 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20  ble for freeing 
32fc0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
32fd0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
32fe0 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  e..*/.char *sqli
32ff0 74 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74  te3BtreeIntegrit
33000 79 43 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20  yCheck(.  Btree 
33010 2a 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62  *p,     /* The b
33020 74 72 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b  tree to be check
33030 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  ed */.  int *aRo
33040 6f 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61  ot,   /* An arra
33050 79 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20  y of root pages 
33060 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69  numbers for indi
33070 76 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a  vidual trees */.
33080 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20    int nRoot,    
33090 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
330a0 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20  ries in aRoot[] 
330b0 2a 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20  */.  int mxErr, 
330c0 20 20 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72     /* Stop repor
330d0 74 69 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65  ting errors afte
330e0 72 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20  r this many */. 
330f0 20 69 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f   int *pnErr    /
33100 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f  * Write number o
33110 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f  f errors seen to
33120 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a   this variable *
33130 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
33140 69 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65  int nRef;.  Inte
33150 67 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a  grityCk sCheck;.
33160 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33170 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
33180 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
33190 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
331a0 2d 3e 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73  ->db;.  nRef = s
331b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
331c0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
331d0 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65  ;.  if( lockBtre
331e0 65 57 69 74 68 52 65 74 72 79 28 70 29 21 3d 53  eWithRetry(p)!=S
331f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33200 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
33210 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
33220 20 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 22   sqlite3StrDup("
33230 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72  Unable to acquir
33240 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  e a read lock on
33250 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29 3b   the database");
33260 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42  .  }.  sCheck.pB
33270 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63  t = pBt;.  sChec
33280 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e  k.pPager = pBt->
33290 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b  pPager;.  sCheck
332a0 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  .nPage = sqlite3
332b0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 73  PagerPagecount(s
332c0 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b 0a 20  Check.pPager);. 
332d0 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20 3d 20   sCheck.mxErr = 
332e0 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63 6b 2e  mxErr;.  sCheck.
332f0 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a 70 6e 45  nErr = 0;.  *pnE
33300 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rr = 0;.#ifndef 
33310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33320 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
33330 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ->nTrunc!=0 ){. 
33340 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20     sCheck.nPage 
33350 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
33360 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
33370 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20  sCheck.nPage==0 
33380 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
33390 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
333a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
333b0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
333c0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
333d0 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71  Check.anRef = sq
333e0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 73  lite3_malloc( (s
333f0 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73  Check.nPage+1)*s
33400 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52  izeof(sCheck.anR
33410 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  ef[0]) );.  if( 
33420 21 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b  !sCheck.anRef ){
33430 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
33440 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
33450 20 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20     *pnErr = 1;. 
33460 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
33470 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
33480 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  urn sqlite3MPrin
33490 74 66 28 70 2d 3e 64 62 2c 20 22 55 6e 61 62 6c  tf(p->db, "Unabl
334a0 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25 64 20 62  e to malloc %d b
334b0 79 74 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20  ytes", .        
334c0 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29  (sCheck.nPage+1)
334d0 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61  *sizeof(sCheck.a
334e0 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  nRef[0]));.  }. 
334f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43 68   for(i=0; i<=sCh
33500 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  eck.nPage; i++){
33510 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
33520 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50 45   = 0; }.  i = PE
33530 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
33540 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d 73  pBt);.  if( i<=s
33550 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a 20  Check.nPage ){. 
33560 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b     sCheck.anRef[
33570 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 43  i] = 1;.  }.  sC
33580 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20 3d 20 30  heck.zErrMsg = 0
33590 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
335a0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
335b0 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f  he freelist.  */
335c0 0a 20 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43  .  checkList(&sC
335d0 68 65 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74  heck, 1, get4byt
335e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
335f0 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20  aData[32]),.    
33600 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
33610 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
33620 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e  Data[36]), "Main
33630 20 66 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a   freelist: ");..
33640 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74    /* Check all t
33650 68 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  he tables..  */.
33660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f    for(i=0; i<nRo
33670 6f 74 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45  ot && sCheck.mxE
33680 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  rr; i++){.    if
33690 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20  ( aRoot[i]==0 ) 
336a0 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65  continue;.#ifnde
336b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
336c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
336d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
336e0 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29   && aRoot[i]>1 )
336f0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 50 74 72  {.      checkPtr
33700 6d 61 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  map(&sCheck, aRo
33710 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f  ot[i], PTRMAP_RO
33720 4f 54 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20  OTPAGE, 0, 0);. 
33730 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
33740 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 26 73  checkTreePage(&s
33750 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
33760 20 30 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65   0, "List of tre
33770 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d  e roots: ");.  }
33780 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
33790 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
337a0 68 65 20 66 69 6c 65 20 69 73 20 72 65 66 65 72  he file is refer
337b0 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72  enced.  */.  for
337c0 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e  (i=1; i<=sCheck.
337d0 6e 50 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e  nPage && sCheck.
337e0 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66  mxErr; i++){.#if
337f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33800 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
33810 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
33820 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  i]==0 ){.      c
33830 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
33840 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20  Check, 0, "Page 
33850 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  %d is never used
33860 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  ", i);.    }.#el
33870 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  se.    /* If the
33880 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
33890 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
338a0 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62  make sure no tab
338b0 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20  les contain.    
338c0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
338d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
338e0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
338f0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
33900 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]==0 && .      
33910 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
33920 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70  pBt, i)!=i || !p
33930 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20  Bt->autoVacuum) 
33940 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
33950 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
33960 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20   0, "Page %d is 
33970 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
33980 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
33990 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d  Check.anRef[i]!=
339a0 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50 54  0 && .       (PT
339b0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
339c0 20 69 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61   i)==i && pBt->a
339d0 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20  utoVacuum) ){.  
339e0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
339f0 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22  sg(&sCheck, 0, "
33a00 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
33a10 20 25 64 20 69 73 20 72 65 66 65 72 65 6e 63 65   %d is reference
33a20 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65  d", i);.    }.#e
33a30 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ndif.  }..  /* M
33a40 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 61 6e  ake sure this an
33a50 61 6c 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c  alysis did not l
33a60 65 61 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29  eave any unref()
33a70 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e   pages.  */.  un
33a80 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
33a90 64 28 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52  d(pBt);.  if( nR
33aa0 65 66 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67  ef != sqlite3Pag
33ab0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
33ac0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63  pPager) ){.    c
33ad0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
33ae0 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20  Check, 0, .     
33af0 20 22 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61   "Outstanding pa
33b00 67 65 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72  ge count goes fr
33b10 6f 6d 20 25 64 20 74 6f 20 25 64 20 64 75 72 69  om %d to %d duri
33b20 6e 67 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  ng this analysis
33b30 22 2c 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73  ",.      nRef, s
33b40 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
33b50 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
33b60 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  .    );.  }..  /
33b70 2a 20 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20  * Clean  up and 
33b80 72 65 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20  report errors.. 
33b90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
33ba0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 73 71  eeLeave(p);.  sq
33bb0 6c 69 74 65 33 5f 66 72 65 65 28 73 43 68 65 63  lite3_free(sChec
33bc0 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45  k.anRef);.  *pnE
33bd0 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
33be0 3b 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63  ;.  return sChec
33bf0 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e  k.zErrMsg;.}.#en
33c00 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
33c10 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
33c20 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CK */../*.** Ret
33c30 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
33c40 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64  hname of the und
33c50 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
33c60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
33c70 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20   pager filename 
33c80 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
33c90 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
33ca0 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
33cb0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
33cc0 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
33cd0 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
33ce0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
33cf0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
33d00 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  ilename(Btree *p
33d10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
33d20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
33d30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
33d40 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
33d50 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
33d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33d70 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
33d80 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
33d90 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
33da0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
33db0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
33dc0 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69  directory name i
33dd0 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
33de0 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
33df0 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
33e00 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
33e10 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
33e20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
33e30 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
33e40 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69  qlite3BtreeGetDi
33e50 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  rname(Btree *p){
33e60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
33e70 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
33e80 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
33e90 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e  PagerDirname(p->
33ea0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
33eb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
33ec0 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
33ed0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
33ee0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
33ef0 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20  . The return.** 
33f00 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f  value of this ro
33f10 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d  utine is the sam
33f20 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  e regardless of 
33f30 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72  whether the jour
33f40 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  nal file.** has 
33f50 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20  been created or 
33f60 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  not..**.** The p
33f70 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ager journal fil
33f80 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61  ename is invaria
33f90 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
33fa0 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
33fb0 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
33fc0 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
33fd0 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
33fe0 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
33ff0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
34000 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
34010 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
34020 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
34030 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
34040 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
34050 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70  Journalname(p->p
34060 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
34070 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34080 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
34090 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65   Copy the comple
340a0 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42  te content of pB
340b0 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f  tFrom into pBtTo
340c0 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
340d0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69  .** must be acti
340e0 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65  ve for both file
340f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  s..**.** The siz
34100 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61  e of file pTo ma
34110 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20  y be reduced by 
34120 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
34130 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
34140 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74  oes wrong, the t
34150 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54  ransaction on pT
34160 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o is rolled back
34170 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
34180 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68  essful, CommitPh
34190 61 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20  aseOne() may be 
341a0 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65  called on pTo be
341b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
341c0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
341d0 68 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d  hould finish com
341e0 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e  mitting the tran
341f0 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62  saction on pTo b
34200 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  y calling.** sql
34210 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
34220 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
34230 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42   btreeCopyFile(B
34240 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
34250 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
34260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34270 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e    Pgno i;..  Pgn
34280 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20  o nFromPage;    
34290 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
342a0 67 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a  ges in pFrom */.
342b0 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20    Pgno nToPage; 
342c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
342d0 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20  of pages in pTo 
342e0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61  */.  Pgno nNewPa
342f0 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ge;      /* Numb
34300 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
34310 54 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f 70  To after the cop
34320 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b  y */..  Pgno iSk
34330 69 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ip;         /* P
34340 65 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67 65  ending byte page
34350 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74   in pTo */.  int
34360 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20   nToPageSize;   
34370 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66   /* Page size of
34380 20 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f   pTo in bytes */
34390 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65  .  int nFromPage
343a0 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73  Size;  /* Page s
343b0 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20  ize of pFrom in 
343c0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68  bytes */..  BtSh
343d0 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54  ared *pBtTo = pT
343e0 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72  o->pBt;.  BtShar
343f0 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46  ed *pBtFrom = pF
34400 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54  rom->pBt;.  pBtT
34410 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b  o->db = pTo->db;
34420 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d  .  pBtFrom->db =
34430 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e   pFrom->db;..  n
34440 54 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  ToPageSize = pBt
34450 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  To->pageSize;.  
34460 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20  nFromPageSize = 
34470 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a  pBtFrom->pageSiz
34480 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69  e;..  if( pTo->i
34490 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
344a0 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e  ITE || pFrom->in
344b0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
344c0 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
344d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
344e0 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e   }.  if( pBtTo->
344f0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
34500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
34510 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67  Y;.  }..  nToPag
34520 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
34530 50 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d  Pagecount(pBtTo-
34540 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f  >pPager);.  nFro
34550 6d 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  mPage = sqlite3P
34560 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
34570 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a  tFrom->pPager);.
34580 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e    iSkip = PENDIN
34590 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54  G_BYTE_PAGE(pBtT
345a0 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62  o);..  /* Variab
345b0 6c 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74  le nNewPage is t
345c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
345d0 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  es required to s
345e0 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f  tore the.  ** co
345f0 6e 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20  ntents of pFrom 
34600 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
34610 74 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70  t page-size of p
34620 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50  To..  */.  nNewP
34630 61 67 65 20 3d 20 28 28 69 36 34 29 6e 46 72 6f  age = ((i64)nFro
34640 6d 50 61 67 65 20 2a 20 28 69 36 34 29 6e 46 72  mPage * (i64)nFr
34650 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20 28 69 36  omPageSize + (i6
34660 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20  4)nToPageSize - 
34670 31 29 20 2f 20 0a 20 20 20 20 20 20 28 69 36 34  1) / .      (i64
34680 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a 20  )nToPageSize;.. 
34690 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
346a0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e  LITE_OK && (i<=n
346b0 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65  ToPage || i<=nNe
346c0 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20  wPage); i++){.. 
346d0 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68     /* Journal th
346e0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e  e original page.
346f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69  .    **.    ** i
34700 53 6b 69 70 20 69 73 20 74 68 65 20 70 61 67 65  Skip is the page
34710 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
34720 6f 63 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e  ocking page (PEN
34730 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a  DING_BYTE_PAGE).
34740 20 20 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61      ** in databa
34750 73 65 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20  se *pTo (before 
34760 74 68 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20  the copy). This 
34770 70 61 67 65 20 69 73 20 6e 65 76 65 72 20 77 72  page is never wr
34780 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e  itten .    ** in
34790 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
347a0 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69  ile. Unless i==i
347b0 53 6b 69 70 20 6f 72 20 74 68 65 20 70 61 67 65  Skip or the page
347c0 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20   was not.    ** 
347d0 70 72 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62  present in pTo b
347e0 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  efore the copy o
347f0 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61  peration, journa
34800 6c 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54  l page i from pT
34810 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
34820 28 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c  ( i!=iSkip && i<
34830 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20  =nToPage ){.    
34840 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
34850 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e;.      rc = sq
34860 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
34870 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
34880 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
34890 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
348a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
348b0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
348c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
348d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
348e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
348f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
34900 20 20 20 20 20 20 69 66 28 20 69 3e 6e 46 72 6f        if( i>nFro
34910 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  mPage ){.       
34920 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65   /* Yeah.  It se
34930 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c  ems wierd to cal
34940 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69  l DontWrite() ri
34950 67 68 74 20 61 66 74 65 72 20 57 72 69 74 65 28  ght after Write(
34960 29 2e 20 42 75 74 0a 20 20 20 20 20 20 20 20 2a  ). But.        *
34970 2a 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73  * that is becaus
34980 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
34990 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20  hose procedures 
349a0 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a  do not exactly .
349b0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65          ** repre
349c0 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20 64  sent what they d
349d0 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61 6c  o.  Write() real
349e0 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68  ly means "put th
349f0 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20  is page in the. 
34a00 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61         ** rollba
34a10 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d  ck journal and m
34a20 61 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20  ark it as dirty 
34a30 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
34a40 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  be written.     
34a50 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74     ** to the dat
34a60 61 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72  abase file later
34a70 2e 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20  ."  DontWrite() 
34a80 75 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e  undoes the secon
34a90 64 20 70 61 72 74 20 6f 66 0a 20 20 20 20 20 20  d part of.      
34aa0 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72    ** that and pr
34ab0 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 20  events the page 
34ac0 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74  from being writt
34ad0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
34ae0 73 65 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  se. The.        
34af0 2a 2a 20 70 61 67 65 20 69 73 20 73 74 69 6c 6c  ** page is still
34b00 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   on the rollback
34b10 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68   journal, though
34b20 2e 20 20 41 6e 64 20 74 68 61 74 20 69 73 20 74  .  And that is t
34b30 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  he .        ** w
34b40 68 6f 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68  hole point of th
34b50 69 73 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74  is block: to put
34b60 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f   pages on the ro
34b70 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
34b80 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34b90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34ba0 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61 67  DontWrite(pDbPag
34bb0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
34bc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
34bd0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
34be0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
34bf0 77 72 69 74 65 20 74 68 65 20 64 61 74 61 20 69  write the data i
34c00 6e 20 70 61 67 65 20 69 20 6f 66 20 74 68 65 20  n page i of the 
34c10 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
34c20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
34c30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69  QLITE_OK && i!=i
34c40 53 6b 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50  Skip && i<=nNewP
34c50 61 67 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62  age ){..      Db
34c60 50 61 67 65 20 2a 70 54 6f 50 61 67 65 20 3d 20  Page *pToPage = 
34c70 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
34c80 5f 69 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20  _int64 iOff;..  
34c90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34ca0 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e  PagerGet(pBtTo->
34cb0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 54 6f 50  pPager, i, &pToP
34cc0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
34cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34ce0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34cf0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34d00 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pToPage);.      
34d10 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 0a 20 20  }..      for(.  
34d20 20 20 20 20 20 20 69 4f 66 66 3d 28 69 2d 31 29        iOff=(i-1)
34d30 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20  *nToPageSize; . 
34d40 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
34d50 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e  E_OK && iOff<i*n
34d60 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20  ToPageSize; .   
34d70 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72       iOff += nFr
34d80 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20  omPageSize.     
34d90 20 29 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61   ){.        DbPa
34da0 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20  ge *pFromPage = 
34db0 30 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  0;.        Pgno 
34dc0 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46  iFrom = (iOff/nF
34dd0 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a  romPageSize)+1;.
34de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
34df0 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  om==PENDING_BYTE
34e00 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20 29  _PAGE(pBtFrom) )
34e10 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
34e20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
34e30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34e40 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
34e50 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69  tFrom->pPager, i
34e60 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65  From, &pFromPage
34e70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34e80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34e90 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
34ea0 7a 54 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67  zTo = sqlite3Pag
34eb0 65 72 47 65 74 44 61 74 61 28 70 54 6f 50 61 67  erGetData(pToPag
34ec0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  e);.          ch
34ed0 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69  ar *zFrom = sqli
34ee0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
34ef0 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20  pFromPage);.    
34f00 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b        int nCopy;
34f10 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
34f20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e  nFromPageSize>=n
34f30 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ToPageSize ){.  
34f40 20 20 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 20            zFrom 
34f50 2b 3d 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67  += ((i-1)*nToPag
34f60 65 53 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d  eSize - ((iFrom-
34f70 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  1)*nFromPageSize
34f80 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
34f90 6e 43 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65 53  nCopy = nToPageS
34fa0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
34fb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34fc0 20 20 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f    zTo += (((iFro
34fd0 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69  m-1)*nFromPageSi
34fe0 7a 65 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50  ze) - (i-1)*nToP
34ff0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
35000 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46        nCopy = nF
35010 72 6f 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  romPageSize;.   
35020 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
35030 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20      memcpy(zTo, 
35040 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09  zFrom, nCopy);..
35050 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35060 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a  ref(pFromPage);.
35070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35080 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  }..      if( pTo
35090 50 61 67 65 20 29 20 73 71 6c 69 74 65 33 50 61  Page ) sqlite3Pa
350a0 67 65 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65  gerUnref(pToPage
350b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
350c0 2f 2a 20 49 66 20 74 68 69 6e 67 73 20 68 61 76  /* If things hav
350d0 65 20 77 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c  e worked so far,
350e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
350f0 6c 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  le may need to b
35100 65 20 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  e .  ** truncate
35110 64 2e 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 70  d. The complex p
35120 61 72 74 20 69 73 20 74 68 61 74 20 69 74 20 6d  art is that it m
35130 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 74 72  ay need to be tr
35140 75 6e 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  uncated to.  ** 
35150 61 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6e  a size that is n
35160 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
35170 6c 74 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67  ltiple of nToPag
35180 65 53 69 7a 65 20 2d 20 74 68 65 20 63 75 72 72  eSize - the curr
35190 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 73 69  ent.  ** page si
351a0 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
351b0 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
351c0 77 69 74 68 20 42 2d 54 72 65 65 20 70 54 6f 2e  with B-Tree pTo.
351d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
351e0 78 61 6d 70 6c 65 2c 20 73 61 79 20 74 68 65 20  xample, say the 
351f0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f  page-size of pTo
35200 20 69 73 20 32 30 34 38 20 62 79 74 65 73 20 61   is 2048 bytes a
35210 6e 64 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  nd the original 
35220 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
35230 70 61 67 65 73 20 69 73 20 35 20 28 31 30 20 4b  pages is 5 (10 K
35240 42 20 66 69 6c 65 29 2e 20 49 66 20 70 46 72 6f  B file). If pFro
35250 6d 20 68 61 73 20 61 20 70 61 67 65 20 73 69 7a  m has a page siz
35260 65 20 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a 20  e of 1024 .  ** 
35270 62 79 74 65 73 20 61 6e 64 20 39 20 70 61 67 65  bytes and 9 page
35280 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  s, then the file
35290 20 6e 65 65 64 73 20 74 6f 20 62 65 20 74 72 75   needs to be tru
352a0 6e 63 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20  ncated to 9KB.. 
352b0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
352c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
352d0 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  f( nFromPageSize
352e0 21 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b  !=nToPageSize ){
352f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
35300 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
35310 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
35320 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
35330 20 20 20 20 69 36 34 20 69 53 69 7a 65 20 3d 20      i64 iSize = 
35340 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69  (i64)nFromPageSi
35350 7a 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50  ze * (i64)nFromP
35360 61 67 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69  age;.      i64 i
35370 4e 6f 77 20 3d 20 28 69 36 34 29 28 28 6e 54 6f  Now = (i64)((nTo
35380 50 61 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e  Page>nNewPage)?n
35390 54 6f 50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29  ToPage:nNewPage)
353a0 20 2a 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53   * (i64)nToPageS
353b0 69 7a 65 3b 20 0a 20 20 20 20 20 20 69 36 34 20  ize; .      i64 
353c0 69 50 65 6e 64 69 6e 67 20 3d 20 28 28 69 36 34  iPending = ((i64
353d0 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  )PENDING_BYTE_PA
353e0 47 45 28 70 42 74 54 6f 29 2d 31 29 20 2a 28 69  GE(pBtTo)-1) *(i
353f0 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a  64)nToPageSize;.
35400 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
35410 20 69 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a   iSize<=iNow );.
35420 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d    .      /* Comm
35430 69 74 20 70 68 61 73 65 20 6f 6e 65 20 73 79 6e  it phase one syn
35440 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
35450 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
35460 69 74 68 20 70 54 6f 20 0a 20 20 20 20 20 20 2a  ith pTo .      *
35470 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
35480 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 2e 20   original data. 
35490 49 74 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63  It does not sync
354a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
354b0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 65  le.      ** itse
354c0 6c 66 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20  lf. After doing 
354d0 74 68 69 73 20 69 74 20 69 73 20 73 61 66 65 20  this it is safe 
354e0 74 6f 20 75 73 65 20 4f 73 54 72 75 6e 63 61 74  to use OsTruncat
354f0 65 28 29 20 61 6e 64 20 6f 74 68 65 72 0a 20 20  e() and other.  
35500 20 20 20 20 2a 2a 20 66 69 6c 65 20 41 50 49 73      ** file APIs
35510 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35520 20 66 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a   file directly..
35530 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
35540 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e  BtTo->db = pTo->
35550 64 62 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  db;.      rc = s
35560 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
35570 74 50 68 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d  tPhaseOne(pBtTo-
35580 3e 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 31  >pPager, 0, 0, 1
35590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
355a0 7a 65 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53  ze<iNow && rc==S
355b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
355c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
355d0 4f 73 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65  OsTruncate(pFile
355e0 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , iSize);.      
355f0 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68  }.  .      /* Th
35600 65 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70 69  e loop that copi
35610 65 64 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74  ed data from dat
35620 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70  abase pFrom to p
35630 54 6f 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 20  To did not.     
35640 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 74 68 65   ** populate the
35650 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f 66   locking page of
35660 20 64 61 74 61 62 61 73 65 20 70 54 6f 2e 20 49   database pTo. I
35670 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  f the page-size 
35680 6f 66 0a 20 20 20 20 20 20 2a 2a 20 70 46 72 6f  of.      ** pFro
35690 6d 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  m is smaller tha
356a0 6e 20 74 68 61 74 20 6f 66 20 70 54 6f 2c 20 74  n that of pTo, t
356b0 68 69 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64  his means some d
356c0 61 74 61 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a  ata will.      *
356d0 2a 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  * not have been 
356e0 63 6f 70 69 65 64 2e 20 0a 20 20 20 20 20 20 2a  copied. .      *
356f0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
35700 62 6c 6f 63 6b 20 63 6f 70 69 65 73 20 74 68 65  block copies the
35710 20 6d 69 73 73 69 6e 67 20 64 61 74 61 20 66 72   missing data fr
35720 6f 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f  om database pFro
35730 6d 20 74 6f 20 70 54 6f 20 0a 20 20 20 20 20 20  m to pTo .      
35740 2a 2a 20 75 73 69 6e 67 20 66 69 6c 65 20 41 50  ** using file AP
35750 49 73 2e 20 54 68 69 73 20 69 73 20 73 61 66 65  Is. This is safe
35760 20 62 65 63 61 75 73 65 20 61 74 20 74 68 69 73   because at this
35770 20 70 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74   point we know t
35780 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  hat.      ** all
35790 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
357a0 20 64 61 74 61 20 66 72 6f 6d 20 70 54 6f 20 68   data from pTo h
357b0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 69  as been synced i
357c0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a  nto the .      *
357d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
357e0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
357f0 20 77 6f 75 6c 64 20 62 65 20 73 61 66 65 20 74   would be safe t
35800 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 74  o do anything at
35810 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f  .      ** all to
35820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35830 6c 65 20 65 78 63 65 70 74 20 74 72 75 6e 63 61  le except trunca
35840 74 65 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  te it to zero by
35850 74 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tes..      */.  
35860 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35870 54 45 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61  TE_OK && nFromPa
35880 67 65 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69  geSize<nToPageSi
35890 7a 65 20 26 26 20 69 53 69 7a 65 3e 69 50 65 6e  ze && iSize>iPen
358a0 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 20 20 69  ding){.        i
358b0 36 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20  64 iOff;.       
358c0 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20   for(.          
358d0 69 4f 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a  iOff=iPending; .
358e0 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
358f0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c  LITE_OK && iOff<
35900 28 69 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67  (iPending+nToPag
35910 65 53 69 7a 65 29 3b 20 0a 20 20 20 20 20 20 20  eSize); .       
35920 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d     iOff += nFrom
35930 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  PageSize.       
35940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62   ){.          Db
35950 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20  Page *pFromPage 
35960 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50  = 0;.          P
35970 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66  gno iFrom = (iOf
35980 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  f/nFromPageSize)
35990 2b 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  +1;.  .         
359a0 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44   if( iFrom==PEND
359b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
359c0 74 46 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e  tFrom) || iFrom>
359d0 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20  nFromPage ){.   
359e0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
359f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
35a00 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
35a10 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
35a20 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
35a30 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50  , iFrom, &pFromP
35a40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35a60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
35a70 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73   char *zFrom = s
35a80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
35a90 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  ta(pFromPage);. 
35aa0 20 09 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
35ab0 4f 73 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a  OsWrite(pFile, z
35ac0 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53  From, nFromPageS
35ad0 69 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20  ize, iOff);.    
35ae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35af0 61 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50  agerUnref(pFromP
35b00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35b10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35b20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
35b30 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
35b40 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
35b50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35b60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
35b70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
35b80 6e 63 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nc(pBtTo->pPager
35b90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
35bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
35bc0 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61  ncate(pBtTo->pPa
35bd0 67 65 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a  ger, nNewPage);.
35be0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
35bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35c00 20 20 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65       pBtTo->page
35c10 53 69 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20  SizeFixed = 0;. 
35c20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
35c30 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
35c40 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
35c50 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  To);.  }..  retu
35c60 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
35c70 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46  qlite3BtreeCopyF
35c80 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20  ile(Btree *pTo, 
35c90 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Btree *pFrom){. 
35ca0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
35cb0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f  e3BtreeEnter(pTo
35cc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
35cd0 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20  eEnter(pFrom);. 
35ce0 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46   rc = btreeCopyF
35cf0 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b  ile(pTo, pFrom);
35d00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
35d10 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73  eave(pFrom);.  s
35d20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
35d30 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pTo);.  return 
35d40 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
35d50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
35d60 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UUM */../*.** Re
35d70 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
35d80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
35d90 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
35da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
35db0 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  nTrans(Btree *p)
35dc0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
35dd0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
35de0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
35df0 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
35e00 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
35e10 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
35e20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
35e30 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
35e40 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
35e50 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
35e60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
35e70 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74  BtreeIsInStmt(Bt
35e80 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
35e90 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
35ea0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
35eb0 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
35ec0 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74   && p->pBt->inSt
35ed0 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mt);.}../*.** Re
35ee0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
35ef0 20 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74   a read (or writ
35f00 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  e) transaction i
35f10 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
35f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
35f30 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65  nReadTrans(Btree
35f40 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
35f50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35f60 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
35f70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20   );.  return (p 
35f80 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  && (p->inTrans!=
35f90 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a  TRANS_NONE));.}.
35fa0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
35fb0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
35fc0 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62  ointer to a blob
35fd0 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
35fe0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  iated with.** a 
35ff0 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74  single shared-bt
36000 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20  ree. The memory 
36010 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e  is used by clien
36020 74 20 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f  t code for its o
36030 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28  wn.** purposes (
36040 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
36050 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76  store a high-lev
36060 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69  el schema associ
36070 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
36080 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e  e shared-btree).
36090 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   The btree layer
360a0 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e   manages referen
360b0 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75  ce counting issu
360c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
360d0 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
360e0 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61   called on a sha
360f0 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65  red-btree, nByte
36100 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  s bytes of memor
36110 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74  y.** are allocat
36120 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20  ed, zeroed, and 
36130 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
36140 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68  caller. For each
36150 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20   subsequent .** 
36160 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20  call the nBytes 
36170 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
36180 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74  ored and a point
36190 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62  er to the same b
361a0 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  lob.** of memory
361b0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a   returned. .**.*
361c0 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68  * Just before th
361d0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69  e shared-btree i
361e0 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75  s closed, the fu
361f0 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73  nction passed as
36200 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61   the .** xFree a
36210 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65  rgument when the
36220 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
36230 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69  on was made is i
36240 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a  nvoked on the .*
36250 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61  * blob of alloca
36260 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73  ted memory. This
36270 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
36280 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65   not call sqlite
36290 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74  3_free().** on t
362a0 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62  he memory, the b
362b0 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20  tree layer does 
362c0 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  that..*/.void *s
362d0 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
362e0 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
362f0 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46  nBytes, void(*xF
36300 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20  ree)(void *)){. 
36310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
36320 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
36330 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
36340 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63  .  if( !pBt->pSc
36350 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
36360 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  >pSchema = sqlit
36370 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79  e3MallocZero(nBy
36380 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78  tes);.    pBt->x
36390 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72  FreeSchema = xFr
363a0 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ee;.  }.  sqlite
363b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
363c0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53    return pBt->pS
363d0 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
363e0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
363f0 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74  nother user of t
36400 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62  he same shared b
36410 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75  tree as the argu
36420 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68  ment.** handle h
36430 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
36440 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71  e lock on the sq
36450 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
36460 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
36470 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
36480 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
36490 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
364a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
364b0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
364c0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
364d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
364e0 72 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65  rc = (queryTable
364f0 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
36500 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21  OOT, READ_LOCK)!
36510 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73  =SQLITE_OK);.  s
36520 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
36530 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
36540 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
36550 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
36560 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74  _CACHE./*.** Obt
36570 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ain a lock on th
36580 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
36590 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e  ot page is iTab.
365a0 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73    The.** lock is
365b0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
365c0 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20   isWritelock is 
365d0 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c  true or a read l
365e0 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  ock.** if it is 
365f0 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
36600 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
36610 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
36620 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69  t iTab, u8 isWri
36630 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  teLock){.  int r
36640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36650 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 28   u8 lockType = (
36660 69 73 57 72 69 74 65 4c 6f 63 6b 3f 57 52 49 54  isWriteLock?WRIT
36670 45 5f 4c 4f 43 4b 3a 52 45 41 44 5f 4c 4f 43 4b  E_LOCK:READ_LOCK
36680 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
36690 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
366a0 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
366b0 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
366c0 70 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pe);.  if( rc==S
366d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
366e0 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
366f0 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65  , iTab, lockType
36700 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
36710 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
36720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
36730 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
36740 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
36750 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  OB./*.** Argumen
36760 74 20 70 43 73 72 20 6d 75 73 74 20 62 65 20 61  t pCsr must be a
36770 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66   cursor opened f
36780 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20 61 6e  or writing on an
36790 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61 62 6c   .** INTKEY tabl
367a0 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  e currently poin
367b0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
367c0 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a 2a 2a  table entry. .**
367d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
367e0 6f 64 69 66 69 65 73 20 74 68 65 20 64 61 74 61  odifies the data
367f0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
36800 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e 0a 2a  of that entry..*
36810 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  * Only the data 
36820 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e 6c 79  content may only
36830 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 74   be modified, it
36840 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
36850 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
36860 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
36870 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a  data stored..*/.
36880 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
36890 50 75 74 44 61 74 61 28 42 74 43 75 72 73 6f 72  PutData(BtCursor
368a0 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66 66 73   *pCsr, u32 offs
368b0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
368c0 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72 74 28  d *z){.  assert(
368d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
368e0 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61 73 73  x(pCsr) );.  ass
368f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
36900 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e 70 42  ex_held(pCsr->pB
36910 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
36920 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 43 73   );.  assert(pCs
36930 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
36940 64 6c 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72  dle);.  if( pCsr
36950 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
36960 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
36970 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53      if( pCsr->eS
36980 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
36990 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LT ){.      retu
369a0 72 6e 20 70 43 73 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCsr->skip;. 
369b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
369c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
369d0 4f 52 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ORT;.    }.  }..
369e0 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20    /* Check some 
369f0 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a  preconditions: .
36a00 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63    **   (a) the c
36a10 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f  ursor is open fo
36a20 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20  r writing,.  ** 
36a30 20 20 28 62 29 20 74 68 65 72 65 20 69 73 20 6e    (b) there is n
36a40 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  o read-lock on t
36a50 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d  he table being m
36a60 6f 64 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a  odified and.  **
36a70 20 20 20 28 63 29 20 74 68 65 20 63 75 72 73 6f     (c) the curso
36a80 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61  r points at a va
36a90 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e  lid row of an in
36aa0 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  tKey table..  */
36ab0 0a 20 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72  .  if( !pCsr->wr
36ac0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
36ad0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
36ae0 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  LY;.  }.  assert
36af0 28 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65  ( !pCsr->pBt->re
36b00 61 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20  adOnly .        
36b10 20 20 26 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e    && pCsr->pBt->
36b20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
36b30 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
36b40 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
36b50 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c  ks(pCsr->pBtree,
36b60 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCsr->pgnoRoot,
36b70 20 70 43 73 72 29 20 29 7b 0a 20 20 20 20 72 65   pCsr) ){.    re
36b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
36b90 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
36ba0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
36bb0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
36bc0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 73  */.  }.  if( pCs
36bd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
36be0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43  R_INVALID || !pC
36bf0 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  sr->pPage->intKe
36c00 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
36c10 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
36c20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  }..  return acce
36c30 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72 2c 20  ssPayload(pCsr, 
36c40 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
36c50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c  signed char *)z,
36c60 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a   0, 1);.}../* .*
36c70 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f 6e 20  * Set a flag on 
36c80 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f 20 63  this cursor to c
36c90 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  ache the locatio
36ca0 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72 6f 6d  ns of pages from
36cb0 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f   the .** overflo
36cc0 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 63  w list for the c
36cd0 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68 69 73  urrent row. This
36ce0 20 69 73 20 75 73 65 64 20 62 79 20 63 75 72 73   is used by curs
36cf0 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f  ors opened.** fo
36d00 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  r incremental bl
36d10 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a  ob IO only..**.*
36d20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
36d30 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e 6c 79  sets a flag only
36d40 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70 61 67  . The actual pag
36d50 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63 68 65  e location cache
36d60 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e 20 42  .** (stored in B
36d70 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
36d80 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61 74 65  w[]) is allocate
36d90 64 20 61 6e 64 20 75 73 65 64 20 62 79 20 66 75  d and used by fu
36da0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 73 73  nction.** access
36db0 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65 20 77  Payload() (the w
36dc0 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  orker function f
36dd0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  or sqlite3BtreeD
36de0 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  ata() and.** sql
36df0 69 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61  ite3BtreePutData
36e00 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ())..*/.void sql
36e10 69 74 65 33 42 74 72 65 65 43 61 63 68 65 4f 76  ite3BtreeCacheOv
36e20 65 72 66 6c 6f 77 28 42 74 43 75 72 73 6f 72 20  erflow(BtCursor 
36e30 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
36e40 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
36e50 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
36e60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
36e70 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
36e80 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
36e90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 21 70  ) );.  assert(!p
36ea0 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
36eb0 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73 65 72 74  andle);.  assert
36ec0 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
36ed0 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e  w);.  pCur->isIn
36ee0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31  crblobHandle = 1
36ef0 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.