/ Hex Artifact Content
Login

Artifact deb7e145e4e287763e317ff36a805826f5ed2e56:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 35 30 35 20 32 30 30 38 2f 30  c,v 1.505 2008/0
0190: 39 2f 30 31 20 31 38 3a 33 34 3a 32 30 20 64 61  9/01 18:34:20 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 30  ite3BtreeTrace=0
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 66 6c  CACHE./*.** A fl
0450: 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
0460: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 68  hether or not sh
0470: 61 72 65 64 20 63 61 63 68 65 20 69 73 20 65 6e  ared cache is en
0480: 61 62 6c 65 64 2e 20 20 41 6c 73 6f 2c 0a 2a 2a  abled.  Also,.**
0490: 20 61 20 6c 69 73 74 20 6f 66 20 42 74 53 68 61   a list of BtSha
04a0: 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61 74  red objects that
04b0: 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f   are eligible fo
04c0: 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e 0a  r participation.
04d0: 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  ** in shared cac
04e0: 68 65 2e 20 20 54 68 65 20 76 61 72 69 61 62 6c  he.  The variabl
04f0: 65 73 20 68 61 76 65 20 66 69 6c 65 20 73 63 6f  es have file sco
0500: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0510: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0520: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0530: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0540: 20 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   these variables
0550: 20 73 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 6d   so we make them
0560: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 66 6f 72 20 74  .** global for t
0570: 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  est builds..*/.#
0580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
0590: 54 0a 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69  T.BtShared *sqli
05a0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
05b0: 73 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  st = 0;.int sqli
05c0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e  te3SharedCacheEn
05d0: 61 62 6c 65 64 20 3d 20 30 3b 0a 23 65 6c 73 65  abled = 0;.#else
05e0: 0a 73 74 61 74 69 63 20 42 74 53 68 61 72 65 64  .static BtShared
05f0: 20 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64 43   *sqlite3SharedC
0600: 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 73 74  acheList = 0;.st
0610: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
0620: 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  SharedCacheEnabl
0630: 65 64 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  ed = 0;.#endif.#
0640: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
0650: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
0660: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
0670: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0680: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61  _CACHE./*.** Ena
0690: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
06a0: 68 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20  he shared pager 
06b0: 61 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75  and schema featu
06c0: 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  res..**.** This 
06d0: 72 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65  routine has no e
06e0: 66 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e  ffect on existin
06f0: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
0700: 63 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73  ctions..** The s
0710: 68 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74  hared cache sett
0720: 69 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79  ing effects only
0730: 20 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f   future calls to
0740: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
0750: 28 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  (), sqlite3_open
0760: 31 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33  16(), or sqlite3
0770: 5f 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69  _open_v2()..*/.i
0780: 6e 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  nt sqlite3_enabl
0790: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69  e_shared_cache(i
07a0: 6e 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71  nt enable){.  sq
07b0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
07c0: 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65  Enabled = enable
07d0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
07e0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
07f0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
0800: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
0810: 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
0820: 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 20  adLocks(Btree*, 
0830: 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f 72 2a 2c  Pgno, BtCursor*,
0840: 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64 65 66 20   i64);...#ifdef 
0850: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0860: 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20  ED_CACHE.  /*.  
0870: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73  ** The functions
0880: 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
0890: 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61  ), lockTable() a
08a0: 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c  nd unlockAllTabl
08b0: 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  es().  ** manipu
08c0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
08d0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
08e0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
08f0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0900: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0910: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0920: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0930: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0940: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0950: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0960: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0970: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0980: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0990: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
09a0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
09b0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
09c0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
09d0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
09e0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
09f0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0a00: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0a10: 65 66 69 6e 65 20 71 75 65 72 79 54 61 62 6c 65  efine queryTable
0a20: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
0a30: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
0a40: 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29  lockTable(a,b,c)
0a50: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
0a60: 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  fine unlockAllTa
0a70: 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a  bles(a).#endif..
0a80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0a90: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0aa0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
0ab0: 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e  see if btree han
0ac0: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
0ad0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
0ae0: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
0af0: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0b00: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
0b10: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
0b20: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
0b30: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
0b40: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
0b50: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
0b60: 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20  g lockTable()), 
0b70: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  or.** SQLITE_LOC
0b80: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
0b90: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54  tatic int queryT
0ba0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
0bb0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38  p, Pgno iTab, u8
0bc0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
0bd0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
0be0: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  t;.  BtLock *pIt
0bf0: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
0c00: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
0c10: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
0c20: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
0c30: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
0c40: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
0c50: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
0c60: 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  0 );.  .  /* Thi
0c70: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
0c80: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
0c90: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
0ca0: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
0cb0: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
0cc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
0cd0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
0ce0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
0cf0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
0d00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
0d10: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
0d20: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
0d30: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
0d40: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78  /.  if( pBt->pEx
0d50: 63 6c 75 73 69 76 65 20 26 26 20 70 42 74 2d 3e  clusive && pBt->
0d60: 70 45 78 63 6c 75 73 69 76 65 21 3d 70 20 29 7b  pExclusive!=p ){
0d70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0d80: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a  TE_LOCKED;.  }..
0d90: 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67    /* This (along
0da0: 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28   with lockTable(
0db0: 29 29 20 69 73 20 77 68 65 72 65 20 74 68 65 20  )) is where the 
0dc0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0dd0: 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64 65 61  flag is.  ** dea
0de0: 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68 65 20  lt with. If the 
0df0: 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69  caller is queryi
0e00: 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f  ng for a read-lo
0e10: 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20  ck and the flag 
0e20: 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69 74 20  is.  ** set, it 
0e30: 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  is unconditional
0e40: 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65 76 65  ly granted - eve
0e50: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 77  n if there are w
0e60: 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20  rite-locks.  ** 
0e70: 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66  on the table. If
0e80: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73   a write-lock is
0e90: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 20   requested, the 
0ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0eb0: 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  flag.  ** is not
0ec0: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a   considered..  *
0ed0: 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69  *.  ** In functi
0ee0: 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20  on lockTable(), 
0ef0: 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  if a read-lock i
0f00: 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64 20 74  s demanded and t
0f10: 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63  he .  ** ReadUnc
0f20: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
0f30: 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69   set, no entry i
0f40: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  s added to the l
0f50: 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20  ocks list .  ** 
0f60: 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29  (BtShared.pLock)
0f70: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73  ..  **.  ** To s
0f80: 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74 68 65  ummarize: If the
0f90: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0fa0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
0fb0: 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  en read cursors 
0fc0: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61  do.  ** not crea
0fd0: 74 65 20 6f 72 20 72 65 73 70 65 63 74 20 74 61  te or respect ta
0fe0: 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c  ble locks. The l
0ff0: 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75 72 65  ocking procedure
1000: 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77 72 69   for a .  ** wri
1010: 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e  te-cursor does n
1020: 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  ot change..  */.
1030: 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d 28 70    if( .    0==(p
1040: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
1050: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1060: 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63  ed) || .    eLoc
1070: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
1080: 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45  .    iTab==MASTE
1090: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
10a0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
10b0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
10c0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
10d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
10e0: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
10f0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
1100: 54 61 62 20 26 26 20 0a 20 20 20 20 20 20 20 20  Tab && .        
1110: 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21    (pIter->eLock!
1120: 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21  =eLock || eLock!
1130: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20  =READ_LOCK) ){. 
1140: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1150: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
1160: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1180: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
1190: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11a0: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
11b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
11d0: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
11e0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
11f0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
1200: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
1210: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
1220: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
1230: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
1240: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
1250: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
1260: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
1270: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1280: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
1290: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
12a0: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
12b0: 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53  TE_BUSY and.** S
12c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20  QLITE_NOMEM may 
12d0: 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64  also be returned
12e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12f0: 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20  lockTable(Btree 
1300: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
1310: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1320: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1330: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
1340: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
1350: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
1360: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1370: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1380: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1390: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
13a0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
13b0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
13c0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
13d0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
13e0: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
13f0: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
1400: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
1410: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
1420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1430: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
1440: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
1450: 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
1460: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
1470: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1480: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
1490: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
14a0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
14b0: 72 65 71 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20  requested,.  ** 
14c0: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74  return early wit
14d0: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
14e0: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
14f0: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
1500: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
1510: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
1520: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66  eryTableLock() f
1530: 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20  or more info on 
1540: 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74  handling .  ** t
1550: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
1560: 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20  ed flag..  */.  
1570: 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64 62 2d  if( .    (p->db-
1580: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
1590: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26  adUncommitted) &
15a0: 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52  & .    (eLock==R
15b0: 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20  EAD_LOCK) &&.   
15c0: 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f   iTable!=MASTER_
15d0: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65  ROOT.  ){.    re
15e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15f0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
1600: 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  search the list 
1610: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
1620: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62  lock on this tab
1630: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  le. */.  for(pIt
1640: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1650: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
1660: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
1670: 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  f( pIter->iTable
1680: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65  ==iTable && pIte
1690: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  r->pBtree==p ){.
16a0: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49        pLock = pI
16b0: 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ter;.      break
16c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16d0: 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73  * If the above s
16e0: 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69  earch did not fi
16f0: 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75  nd a BtLock stru
1700: 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42  ct associating B
1710: 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68  tree p.  ** with
1720: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61   table iTable, a
1730: 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20  llocate one and 
1740: 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
1750: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   list..  */.  if
1760: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
1770: 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20  pLock = (BtLock 
1780: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1790: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63  ero(sizeof(BtLoc
17a0: 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c  k));.    if( !pL
17b0: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ock ){.      ret
17c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
17d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
17e0: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
17f0: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
1800: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
1810: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
1820: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
1830: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
1840: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1850: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
1860: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
1870: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
1880: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
1890: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
18a0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
18b0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
18c0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
18d0: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
18e0: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
18f0: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
1900: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
1910: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
1920: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
1930: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
1940: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
1950: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
1960: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
1970: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
1980: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1990: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
19a0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
19b0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
19c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
19e0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
19f0: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
1a00: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
1a10: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 20 74  d via calls to t
1a20: 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29 0a 2a  he lockTable().*
1a30: 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  * procedure) hel
1a40: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
1a50: 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e p..*/.static v
1a60: 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  oid unlockAllTab
1a70: 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  les(Btree *p){. 
1a80: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a90: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
1aa0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
1ab0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
1ac0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1ad0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
1af0: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
1b00: 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c  pIter );..  whil
1b10: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
1b20: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
1b30: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61  = *ppIter;.    a
1b40: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 45 78 63  ssert( pBt->pExc
1b50: 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74  lusive==0 || pBt
1b60: 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 70 4c  ->pExclusive==pL
1b70: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
1b80: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1b90: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
1ba0: 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b   *ppIter = pLock
1bb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
1bc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
1bd0: 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
1be0: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
1bf0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
1c00: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42   }.  }..  if( pB
1c10: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 70  t->pExclusive==p
1c20: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 45 78   ){.    pBt->pEx
1c30: 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 7d  clusive = 0;.  }
1c40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1c50: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1c60: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
1c70: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
1c80: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
1c90: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
1ca0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
1cb0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
1cc0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
1cd0: 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
1ce0: 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64  tShared.*/.#ifnd
1cf0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
1d00: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
1d10: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
1d20: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
1d30: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d40: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
1d50: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
1d60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1d70: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
1d80: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
1d90: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1da0: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
1db0: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
1dc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
1dd0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1de0: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
1df0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
1e00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1e10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
1e20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
1e30: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
1e40: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
1e50: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
1e60: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
1e70: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1e80: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
1e90: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
1ea0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
1eb0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
1ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ed0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1ee0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
1ef0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
1f00: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
1f10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1f30: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
1f40: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1f50: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1f60: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1f70: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
1f80: 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
1f90: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
1fa0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
1fb0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
1fc0: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1fd0: 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(x).#endif../*.
1fe0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
1ff0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2000: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
2010: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
2020: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
2030: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
2040: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
2050: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
2060: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74  QUIRESEEK..*/.st
2070: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
2080: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2090: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
20a0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
20b0: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
20c0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
20d0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
20e0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
20f0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2100: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
2110: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2120: 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
2130: 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a   &pCur->nKey);..
2140: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2150: 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c  an intKey table,
2160: 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20   then the above 
2170: 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79  call to BtreeKey
2180: 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72  Size().  ** stor
2190: 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  es the integer k
21a0: 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ey in pCur->nKey
21b0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
21c0: 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a  his value is.  *
21d0: 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  * all that is re
21e0: 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73  quired. Otherwis
21f0: 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f  e, if pCur is no
2200: 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  t open on an int
2210: 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20  Key.  ** table, 
2220: 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63  then malloc spac
2230: 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20  e for and store 
2240: 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  the pCur->nKey b
2250: 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a  ytes of key .  *
2260: 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69  * data..  */.  i
2270: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2280: 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 70 50 61   && 0==pCur->pPa
2290: 67 65 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20  ge->intKey){.   
22a0: 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71   void *pKey = sq
22b0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 43 75 72  lite3Malloc(pCur
22c0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  ->nKey);.    if(
22d0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72   pKey ){.      r
22e0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22f0: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 70 43 75  Key(pCur, 0, pCu
2300: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
2310: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2320: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2330: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
2340: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
2350: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2360: 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
2370: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2380: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2390: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
23a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
23b0: 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
23c0: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
23d0: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
23e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23f0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
2400: 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
2410: 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 30 3b  pCur->pPage = 0;
2420: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2430: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
2440: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69  RESEEK;.  }..  i
2450: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
2460: 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
2470: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2480: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
2490: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
24a0: 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45 78  rsors except pEx
24b0: 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65  cept open on the
24c0: 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20   table .** with 
24d0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
24e0: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
24f0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
2500: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
2510: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
2520: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
2530: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
2540: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
2550: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
2560: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
2570: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
2580: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
2590: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
25a0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
25b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
25d0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25e0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
25f0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
2600: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
2610: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2620: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2630: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
2640: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
2650: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
2660: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
2670: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
2680: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2690: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
26a0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
26b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
26c0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
26d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2700: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2710: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
2720: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2730: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2740: 64 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  d clearCursorPos
2750: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
2760: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
2770: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2780: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
2790: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
27a0: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
27b0: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
27c0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27d0: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
27e0: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
27f0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
2800: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
2810: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
2820: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
2830: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
2840: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
2850: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
2860: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
2870: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
2880: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
2890: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
28a0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
28b0: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
28c0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
28d0: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
28e0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
28f0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
2900: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
2910: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  ition()..*/.int 
2920: 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74  sqlite3BtreeRest
2930: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2940: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
2950: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
2960: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2970: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2980: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2990: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
29a0: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
29b0: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29c0: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
29d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
29e0: 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20  ur->skip;.  }.  
29f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2a00: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2a20: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
2a30: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
2a40: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
2a50: 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63  >skip);.  if( rc
2a60: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a70: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2a80: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
2a90: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
2aa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2ab0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ac0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2ad0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ae0: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20  INVALID );.  }. 
2af0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2b00: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
2b10: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2b20: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
2b30: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b40: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
2b50: 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74  sqlite3BtreeRest
2b60: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2b70: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
2b80: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
2b90: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
2ba0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
2bb0: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
2bc0: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
2bd0: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
2be0: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
2bf0: 73 6f 72 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  sor can move whe
2c00: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
2c10: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
2c20: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
2c30: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
2c40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2c50: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
2c60: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
2c70: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
2c80: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
2c90: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
2ca0: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
2cb0: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
2cc0: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
2cd0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ce0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
2cf0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
2d00: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
2d10: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2d20: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
2d30: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2d40: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2d50: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
2d60: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
2d70: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
2d80: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2d90: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2da0: 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20  ->skip!=0 ){.   
2db0: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
2dc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2dd0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2de0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2df0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
2e00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2e10: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
2e20: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
2e30: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
2e40: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
2e50: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
2e60: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2e70: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2e80: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2e90: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
2ea0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
2eb0: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
2ec0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
2ed0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
2ee0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ef0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
2f00: 50 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72  Page, iPtrMap, r
2f10: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
2f20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2f30: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2f40: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
2f50: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
2f60: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
2f70: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
2f80: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
2f90: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
2fa0: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
2fb0: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
2fc0: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
2fd0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2fe0: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
2ff0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
3000: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
3010: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
3020: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
3030: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
3040: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
3050: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
3060: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
3070: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
3080: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
3090: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
30a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
30b0: 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  no'..** An error
30c0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
30d0: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
30e0: 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72  oes wrong, other
30f0: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
3100: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
3110: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
3120: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
3130: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
3140: 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67  parent){.  DbPag
3150: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
3160: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
3170: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
3180: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
3190: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
31a0: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
31b0: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
31c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
31d0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
31e0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
31f0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
3200: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
3210: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
3220: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3230: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
3240: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
3250: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
3260: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
3270: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
3280: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
3290: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
32a0: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
32b0: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
32c0: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
32d0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
32e0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
32f0: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
3300: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
3310: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
3320: 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20  ;.  }.  iPtrmap 
3330: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
3340: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
3350: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
3360: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
3370: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
3380: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3390: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
33a0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f  turn rc;.  }.  o
33b0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
33c0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
33d0: 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61  , key);.  pPtrma
33e0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
33f0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
3400: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
3410: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
3420: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
3430: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
3440: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
3450: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
3460: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
3470: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
3480: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
3490: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
34a0: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
34b0: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
34c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34d0: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
34e0: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
34f0: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
3500: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
3510: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
3520: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50  .  }..  sqlite3P
3530: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
3540: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
3550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
3560: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
3570: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
3580: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3590: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
35a0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
35b0: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
35c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
35d0: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
35e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
35f0: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
3600: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
3610: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
3620: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
3630: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
3640: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
3650: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
3660: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
3670: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
3680: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
3690: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
36a0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
36b0: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
36c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
36d0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
36e0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
36f0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
3700: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
3710: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
3720: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
3730: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
3740: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
3750: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
3760: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
3770: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
3780: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
3790: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
37a0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
37b0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
37c0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
37d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37e0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
37f0: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
3800: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
3810: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
3820: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
3830: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
3840: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
3850: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
3860: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
3870: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
3880: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
3890: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
38a0: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
38b0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
38c0: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
38d0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
38e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
38f0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
3900: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
3910: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
3920: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
3930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
3940: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
3950: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3960: 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69  #else /* if defi
3970: 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned SQLITE_OMIT_
3980: 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20  AUTOVACUUM */.  
3990: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
39a0: 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54  t(w,x,y,z) SQLIT
39b0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70  E_OK.  #define p
39c0: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
39d0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
39e0: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
39f0: 76 66 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f  vfl(y,z) SQLITE_
3a00: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
3a10: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
3a20: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
3a30: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
3a40: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
3a50: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
3a60: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
3a70: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
3a80: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
3a90: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
3aa0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
3ab0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ac0: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
3ad0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
3ae0: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
3af0: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
3b00: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49  ine findCell(P,I
3b10: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
3b20: 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  a + ((P)->maskPa
3b30: 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28  ge & get2byte(&(
3b40: 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63  P)->aData[(P)->c
3b50: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d  ellOffset+2*(I)]
3b60: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )))../*.** This 
3b70: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
3b80: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
3b90: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
3ba0: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
3bb0: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
3bc0: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65  rflow cells.  Se
3bd0: 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74  e insert.*/.stat
3be0: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
3bf0: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
3c00: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
3c10: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
3c20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3c30: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
3c40: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
3c50: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
3c60: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
3c70: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
3c80: 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f  k;.    struct _O
3c90: 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a  vflCell *pOvfl;.
3ca0: 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61      pOvfl = &pPa
3cb0: 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20  ge->aOvfl[i];.  
3cc0: 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78    k = pOvfl->idx
3cd0: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
3ce0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
3cf0: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
3d00: 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c      return pOvfl
3d10: 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pCell;.      }
3d20: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
3d30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3d40: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
3d50: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
3d60: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
3d70: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
3d80: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
3d90: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
3da0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
3db0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
3dc0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
3dd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
3de0: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
3df0: 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20   .** cell index 
3e00: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
3e10: 67 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74  gument and sqlit
3e20: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3e30: 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20  Ptr() .** takes 
3e40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3e50: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c   body of the cel
3e60: 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20  l as its second 
3e70: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
3e80: 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65  Within this file
3e90: 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28  , the parseCell(
3ea0: 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63  ) macro can be c
3eb0: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66  alled instead of
3ec0: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
3ed0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20  ParseCellPtr(). 
3ee0: 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69  Using some compi
3ef0: 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  lers, this will 
3f00: 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f  be faster..*/.vo
3f10: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  id sqlite3BtreeP
3f20: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
3f30: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
3f40: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
3f50: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
3f60: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
3f70: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
3f80: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
3f90: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
3fa0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
3fb0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
3fc0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
3fd0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ure */.){.  int 
3fe0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3ff0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79      /* Number by
4000: 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74  tes in cell cont
4010: 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ent header */.  
4020: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
4030: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4040: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
4050: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
4060: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4070: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
4080: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
4090: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  ;..  pInfo->pCel
40a0: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
40b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
40c0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
40d0: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
40e0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
40f0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
4100: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
4110: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
4120: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69  >intKey ){.    i
4130: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
4140: 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  a ){.      n += 
4150: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
4160: 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ll[n], nPayload)
4170: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4180: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
4190: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
41a0: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
41b0: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
41c0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
41d0: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
41e0: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
41f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
4200: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
4210: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
4220: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
4230: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
4240: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
4250: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
4260: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
4270: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
4280: 3d 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  = n;.  if( likel
4290: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
42a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
42b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
42c0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
42d0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
42e0: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
42f0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
4300: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
4310: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
4320: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
4330: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
4340: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
4350: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
4360: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
4370: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
4380: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70  yload + n;.    p
4390: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e  Info->nLocal = n
43a0: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
43b0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
43c0: 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a  0;.    if( (nSiz
43d0: 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20  e & ~3)==0 ){.  
43e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
43f0: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
4400: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
4410: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
4420: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a  fo->nSize = nSiz
4430: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
4440: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
4450: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
4460: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
4470: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
4480: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
4490: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
44a0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
44b0: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
44c0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
44d0: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
44e0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
44f0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
4500: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
4510: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
4520: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
4530: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
4540: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
4550: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
4560: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
4570: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
4580: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
4590: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
45a0: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
45b0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
45c0: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
45d0: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
45e0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
45f0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
4600: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
4610: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
4620: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
4630: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
4640: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
4650: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
4660: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
4670: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
4680: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
4690: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
46a0: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
46b0: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
46c0: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
46d0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
46e0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
46f0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
4700: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
4710: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
4720: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
4730: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
4740: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
4750: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
4760: 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20  e - 4);.    if( 
4770: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
4780: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
4790: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72  fo->nLocal = sur
47a0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
47b0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
47c0: 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  ocal = minLocal;
47d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
47e0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49  ->iOverflow = pI
47f0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b  nfo->nLocal + n;
4800: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
4810: 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72  e = pInfo->iOver
4820: 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a  flow + 4;.  }.}.
4830: 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c  #define parseCel
4840: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4850: 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74  pInfo) \.  sqlit
4860: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
4870: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
4880: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
4890: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
48a0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  ).void sqlite3Bt
48b0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
48c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
48d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
48e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
48f0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
4900: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
4910: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
4920: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
4930: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
4940: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
4950: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
4960: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
4970: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
4980: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
4990: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
49a0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
49b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
49c0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
49d0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
49e0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
49f0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
4a00: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
4a10: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
4a20: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
4a30: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
4a40: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
4a50: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
4a60: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
4a70: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
4a80: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23  ll pointer..*/.#
4a90: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
4aa0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
4ab0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
4ac0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
4ad0: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
4ae0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4af0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
4b00: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72  ell, &info);.  r
4b10: 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65  eturn info.nSize
4b20: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ;.}.#endif.stati
4b30: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
4b40: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
4b50: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
4b60: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
4b70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4b80: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
4b90: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
4ba0: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
4bb0: 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ize;.}..#ifndef 
4bc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
4bd0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
4be0: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
4bf0: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
4c00: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
4c10: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
4c20: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
4c30: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
4c40: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
4c50: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
4c60: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
4c70: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
4c80: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
4c90: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
4ca0: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
4cb0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72  fo info;.  asser
4cc0: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
4cd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4ce0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
4cf0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
4d00: 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
4d10: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
4d20: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
4d30: 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
4d40: 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e 66 6f  d );.  if( (info
4d50: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
4d60: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
4d70: 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
4d80: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
4d90: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
4da0: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
4db0: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
4dc0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
4dd0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
4de0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
4df0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
4e00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4e10: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
4e20: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
4e30: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
4e40: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
4e50: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
4e60: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
4e70: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
4e80: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
4e90: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
4ea0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
4eb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4ec0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
4ed0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
4ee0: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
4ef0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
4f00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4f10: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
4f20: 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c  utex) );.  pCell
4f30: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
4f40: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4f50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
4f60: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
4f70: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
4f80: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
4f90: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
4fa0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
4fb0: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
4fc0: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
4fd0: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
4fe0: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
4ff0: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
5000: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
5010: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
5020: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
5030: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
5040: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
5050: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
5060: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
5070: 76 6f 69 64 20 64 65 66 72 61 67 6d 65 6e 74 50  void defragmentP
5080: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
5090: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
50c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
50f0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
5100: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
5110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5120: 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62  ffset of first b
5130: 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70  yte after cell p
5140: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
5150: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5170: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
5180: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
5190: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
51a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
51b0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
51c0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
51e0: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
51f0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
5200: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
5210: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
5220: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
5230: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
5240: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
5250: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
5260: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
5270: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
5280: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
5290: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
52a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
52b0: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
52c0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
52d0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
52e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
52f0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
5300: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
5310: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
5320: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
5330: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
5340: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
5350: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
5360: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
5370: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
5380: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
5390: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
53a0: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
53b0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
53c0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
53d0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
53e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
53f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5400: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
5410: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
5420: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
5430: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
5440: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64  Bt->pPager);.  d
5450: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
5460: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
5470: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
5480: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
5490: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
54a0: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
54b0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
54c0: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
54d0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
54e0: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
54f0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
5500: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b  ableSize;.  cbrk
5510: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5520: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  a[hdr+5]);.  mem
5530: 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c  cpy(&temp[cbrk],
5540: 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73   &data[cbrk], us
5550: 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29  ableSize - cbrk)
5560: 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c  ;.  cbrk = usabl
5570: 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30  eSize;.  for(i=0
5580: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
5590: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
55a0: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
55b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
55c0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
55d0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
55e0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
55f0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
5600: 20 20 20 61 73 73 65 72 74 28 20 70 63 3c 70 50     assert( pc<pP
5610: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5620: 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65  Size );.    size
5630: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
5640: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
5650: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
5660: 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ze;.    memcpy(&
5670: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d  data[cbrk], &tem
5680: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
5690: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
56a0: 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61  , cbrk);.  }.  a
56b0: 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63 65 6c  ssert( cbrk>=cel
56c0: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20  lOffset+2*nCell 
56d0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
56e0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b  ata[hdr+5], cbrk
56f0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d  );.  data[hdr+1]
5700: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
5710: 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +2] = 0;.  data[
5720: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64  hdr+7] = 0;.  ad
5730: 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b  dr = cellOffset+
5740: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65  2*nCell;.  memse
5750: 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30  t(&data[addr], 0
5760: 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a 7d 0a  , cbrk-addr);.}.
5770: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
5780: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
5790: 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a  pace on a page..
57a0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
57b0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
57c0: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
57d0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
57e0: 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  ** the new alloc
57f0: 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c 6c  ation.  The call
5800: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
5810: 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
5820: 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20 54 68  gh.** space.  Th
5830: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
5840: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
5850: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f  * If the page co
5860: 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66  ntains nBytes of
5870: 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20   free space but 
5880: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5890: 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f  .** nBytes of co
58a0: 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70  ntiguous free sp
58b0: 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ace, then this r
58c0: 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63  outine automatic
58d0: 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65  ally.** calls de
58e0: 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20  fragementPage() 
58f0: 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61  to consolidate a
5900: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65  ll free space be
5910: 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  fore .** allocat
5920: 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e  ing the new chun
5930: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
5940: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
5950: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5960: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74  nt nByte){.  int
5970: 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a   addr, pc, hdr;.
5980: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e    int size;.  in
5990: 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74  t nFrag;.  int t
59a0: 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  op;.  int nCell;
59b0: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
59c0: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
59d0: 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64  ar *data;.  .  d
59e0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
59f0: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ta;.  assert( sq
5a00: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
5a10: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
5a20: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
5a30: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
5a40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5a50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
5a60: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5a70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
5a80: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
5a90: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
5aa0: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
5ab0: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
5ac0: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
5ad0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
5ae0: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  low==0 );.  pPag
5af0: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  e->nFree -= nByt
5b00: 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  e;.  hdr = pPage
5b10: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20  ->hdrOffset;..  
5b20: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
5b30: 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  +7];.  if( nFrag
5b40: 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  <60 ){.    /* Se
5b50: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
5b60: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
5b70: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
5b80: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20  to satisfy the. 
5b90: 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75     ** space requ
5ba0: 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72  est. */.    addr
5bb0: 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68   = hdr+1;.    wh
5bc0: 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32 62  ile( (pc = get2b
5bd0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5be0: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a  )>0 ){.      siz
5bf0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
5c00: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
5c10: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
5c20: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5c30: 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a  size<nByte+4 ){.
5c40: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
5c50: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
5c60: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
5c70: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
5c80: 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a  7] = nFrag + siz
5c90: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
5ca0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a       return pc;.
5cb0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5cc0: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
5cd0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73  e(&data[pc+2], s
5ce0: 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20  ize-nByte);.    
5cf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
5d00: 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  + size - nByte;.
5d10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5d20: 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  }.      addr = p
5d30: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
5d40: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
5d50: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
5d60: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
5d70: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
5d80: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
5d90: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
5da0: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  ..  */.  top = g
5db0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5dc0: 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d  r+5]);.  nCell =
5dd0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5de0: 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f  hdr+3]);.  cellO
5df0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
5e00: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  ellOffset;.  if(
5e10: 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65   nFrag>=60 || ce
5e20: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
5e30: 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65  ll > top - nByte
5e40: 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65   ){.    defragme
5e50: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
5e60: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
5e70: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5e80: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
5e90: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
5ea0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5eb0: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
5ec0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5ed0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
5ee0: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
5ef0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
5f00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
5f10: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
5f20: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
5f30: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
5f40: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
5f50: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
5f60: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
5f70: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5f80: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
5f90: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
5fa0: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
5fb0: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
5fc0: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
5fd0: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
5fe0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
5ff0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
6000: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
6010: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
6020: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6030: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
6040: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
6050: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
6060: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
6070: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
6080: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
6090: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
60a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
60b0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
60c0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
60d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
60e0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
60f0: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
6100: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
6110: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
6120: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
6130: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
6140: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6150: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6160: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
6180: 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=0 );   /* Min
6190: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
61a0: 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  s 4 */..#ifdef S
61b0: 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
61c0: 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  ETE.  /* Overwri
61d0: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
61e0: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
61f0: 73 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52  s when the SECUR
6200: 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f  E_DELETE .  ** o
6210: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
6220: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
6230: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   */.  memset(&da
6240: 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69  ta[start], 0, si
6250: 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
6260: 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20  * Add the space 
6270: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69  back into the li
6280: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65  nked list of fre
6290: 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72  eblocks */.  hdr
62a0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
62b0: 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64  set;.  addr = hd
62c0: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
62d0: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
62e0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
62f0: 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e  <start && pbegin
6300: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
6310: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
6320: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6330: 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -4 );.    assert
6340: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
6350: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
6360: 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  in;.  }.  assert
6370: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
6380: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6390: 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -4 );.  assert( 
63a0: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
63b0: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
63c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
63d0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
63e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
63f0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
6400: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
6410: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
6420: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
6430: 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  = size;..  /* Co
6440: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
6450: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
6460: 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68   addr = pPage->h
6470: 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20  drOffset + 1;.  
6480: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
6490: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
64a0: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
64b0: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
64c0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
64d0: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
64e0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
64f0: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
6500: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
6510: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
6520: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
6530: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
6540: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6550: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
6560: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
6570: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
6580: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
6590: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
65a0: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
65b0: 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ze);.      asser
65c0: 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70 50  t( frag<=data[pP
65d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
65e0: 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61 5b  ] );.      data[
65f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6600: 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20  +7] -= frag;.   
6610: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
6620: 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32 62  a[pbegin], get2b
6630: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
6640: 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ));.      put2by
6650: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
6660: 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62 79  2], pnext+get2by
6670: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32  te(&data[pnext+2
6680: 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20 20  ])-pbegin);.    
6690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
66a0: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
66b0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
66c0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
66d0: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
66e0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
66f0: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
6700: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
6710: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
6720: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
6730: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
6740: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
6750: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6760: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
6770: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
6780: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
6790: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
67a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
67b0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75  [hdr+5]);.    pu
67c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
67d0: 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32 62  +5], top + get2b
67e0: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
67f0: 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  +2]));.  }.}../*
6800: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
6810: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
6820: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
6830: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
6840: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
6850: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
6860: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
6870: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
6880: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
6890: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
68a0: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
68b0: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
68c0: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
68d0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
68e0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
68f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
6900: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
6910: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
6920: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
6930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6940: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
6950: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
6960: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
6970: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
6980: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
6990: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
69a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
69b0: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
69c0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
69d0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
69e0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
69f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6a00: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
6a10: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
6a20: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
6a30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6a40: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6a50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
6a60: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 66 6c 61  Page->leaf = fla
6a70: 67 42 79 74 65 3e 3e 33 3b 20 20 61 73 73 65 72  gByte>>3;  asser
6a80: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
6a90: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
6aa0: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
6ab0: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
6ac0: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
6ad0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
6ae0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
6af0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
6b00: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
6b10: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
6b20: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
6b30: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  1;.    pPage->ha
6b40: 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  sData = pPage->l
6b50: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
6b60: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
6b70: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
6b80: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
6b90: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
6ba0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
6bb0: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
6bc0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
6bd0: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
6be0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30  age->hasData = 0
6bf0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
6c00: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
6c10: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
6c20: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6c30: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
6c40: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
6c50: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6c60: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
6c70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6c80: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
6c90: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
6ca0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
6cb0: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
6cc0: 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 20 70  ** The pParent p
6cd0: 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65  arameter must be
6ce0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6cf0: 65 20 4d 65 6d 50 61 67 65 20 77 68 69 63 68 0a  e MemPage which.
6d00: 2a 2a 20 69 73 20 74 68 65 20 70 61 72 65 6e 74  ** is the parent
6d10: 20 6f 66 20 74 68 65 20 70 61 67 65 20 62 65 69   of the page bei
6d20: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  ng initialized. 
6d30: 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 0a 2a   The root of a.*
6d40: 2a 20 42 54 72 65 65 20 68 61 73 20 6e 6f 20 70  * BTree has no p
6d50: 61 72 65 6e 74 20 61 6e 64 20 73 6f 20 66 6f 72  arent and so for
6d60: 20 74 68 61 74 20 70 61 67 65 2c 20 70 50 61 72   that page, pPar
6d70: 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  ent==NULL..**.**
6d80: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
6d90: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
6da0: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
6db0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
6dc0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
6dd0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
6de0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
6df0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
6e00: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
6e10: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
6e20: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
6e30: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
6e40: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
6e50: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
6e60: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
6e70: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
6e80: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
6e90: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  uption..*/.int s
6ea0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
6eb0: 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
6ec0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  pPage,        /*
6ed0: 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
6ee0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
6ef0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
6f00: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  t       /* The p
6f10: 61 72 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65  arent.  Might be
6f20: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
6f30: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
6f40: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
6f50: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
6f60: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
6f70: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
6f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
6f90: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
6fa0: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
6fb0: 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
6fc0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
6fd0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
6fe0: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
6ff0: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
7000: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
7010: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
7020: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
7030: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
7040: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
7050: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
7060: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
7070: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
7080: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
7090: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
70a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
70b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
70c0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
70d0: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
70e0: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
70f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
7100: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
7110: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
7120: 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ..  pBt = pPage-
7130: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
7140: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
7150: 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 7c  rt( pParent==0 |
7160: 7c 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d  | pParent->pBt==
7170: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
7180: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7190: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
71a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
71b0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
71c0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
71d0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
71e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
71f0: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
7200: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
7210: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
7220: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7230: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
7240: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
7250: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
7260: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
7270: 72 65 6e 74 21 3d 70 50 61 72 65 6e 74 20 26 26  rent!=pParent &&
7280: 20 28 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74   (pPage->pParent
7290: 21 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 69 73  !=0 || pPage->is
72a0: 49 6e 69 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  Init) ){.    /* 
72b0: 54 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  The parent page 
72c0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 63 68 61  should never cha
72d0: 6e 67 65 20 75 6e 6c 65 73 73 20 74 68 65 20 66  nge unless the f
72e0: 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 20 2a  ile is corrupt *
72f0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
7300: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7310: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
7320: 65 2d 3e 69 73 49 6e 69 74 20 29 20 72 65 74 75  e->isInit ) retu
7330: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7340: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
7350: 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  nt==0 && pParent
7360: 21 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  !=0 ){.    pPage
7370: 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
7380: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
7390: 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74  PagerRef(pParent
73a0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
73b0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
73c0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  drOffset;.  data
73d0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
73e0: 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61  .  if( decodeFla
73f0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
7400: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
7410: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7420: 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  T;.  assert( pBt
7430: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
7440: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
7450: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
7460: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
7470: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
7480: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
7490: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67  flow = 0;.  pPag
74a0: 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b  e->idxShift = 0;
74b0: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
74c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
74d0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
74e0: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
74f0: 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
7500: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
7510: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
7520: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
7530: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
7540: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
7550: 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61  r+3]);.  if( pPa
7560: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
7570: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  L(pBt) ){.    /*
7580: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
7590: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
75a0: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
75b0: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
75c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
75d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
75e0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
75f0: 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72  nCell==0 && pPar
7600: 65 6e 74 21 3d 30 20 26 26 20 70 50 61 72 65 6e  ent!=0 && pParen
7610: 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  t->pgno!=1 ){.  
7620: 20 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6d    /* All pages m
7630: 75 73 74 20 68 61 76 65 20 61 74 20 6c 65 61 73  ust have at leas
7640: 74 20 6f 6e 65 20 63 65 6c 6c 2c 20 65 78 63 65  t one cell, exce
7650: 70 74 20 66 6f 72 20 72 6f 6f 74 20 70 61 67 65  pt for root page
7660: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
7670: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7680: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
7690: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
76a0: 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74   free space on t
76b0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 63 20  he page */.  pc 
76c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
76d0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65  [hdr+1]);.  nFre
76e0: 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
76f0: 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66  + top - (cellOff
7700: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
7710: 43 65 6c 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20  Cell);.  while( 
7720: 70 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  pc>0 ){.    int 
7730: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
7740: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
7750: 65 2d 34 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  e-4 ){.      /* 
7760: 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66  Free block is of
7770: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
7780: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7790: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
77a0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 20  .    }.    next 
77b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
77c0: 5b 70 63 5d 29 3b 0a 20 20 20 20 73 69 7a 65 20  [pc]);.    size 
77d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
77e0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
77f0: 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c   next>0 && next<
7800: 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20  =pc+size+3 ){.  
7810: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
7820: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 63  ks must be in ac
7830: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
7840: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7850: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7860: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46  T; .    }.    nF
7870: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20 20  ree += size;.   
7880: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 7d 0a   pc = next;.  }.
7890: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
78a0: 20 6e 46 72 65 65 3b 0a 20 20 69 66 28 20 6e 46   nFree;.  if( nF
78b0: 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  ree>=usableSize 
78c0: 29 7b 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 73  ){.    /* Free s
78d0: 70 61 63 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  pace cannot exce
78e0: 65 64 20 74 6f 74 61 6c 20 70 61 67 65 20 73 69  ed total page si
78f0: 7a 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ze */.    return
7900: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7910: 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 23 69 66 20  BKPT; .  }..#if 
7920: 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  0.  /* Check tha
7930: 74 20 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74  t all the offset
7940: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66  s in the cell of
7950: 66 73 65 74 20 61 72 72 61 79 20 61 72 65 20 77  fset array are w
7960: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20  ithin range. .  
7970: 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e  ** .  ** Omittin
7980: 67 20 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e  g this consisten
7990: 63 79 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69  cy check and usi
79a0: 6e 67 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61  ng the pPage->ma
79b0: 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a  skPage mask.  **
79c0: 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72   to prevent over
79d0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65  running the page
79e0: 20 62 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43   buffer in findC
79f0: 65 6c 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e  ell() results in
7a00: 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72   a.  ** 2.5% per
7a10: 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20  formance gain.. 
7a20: 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a   */.  {.    u8 *
7a30: 70 4f 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pOff;        /* 
7a40: 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f  Iterator used to
7a50: 20 63 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20   check all cell 
7a60: 6f 66 66 73 65 74 73 20 61 72 65 20 69 6e 20 72  offsets are in r
7a70: 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ange */.    u8 *
7a80: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  pEnd;        /* 
7a90: 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f  Pointer to end o
7aa0: 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72  f cell offset ar
7ab0: 72 61 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61  ray */.    u8 ma
7ac0: 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  sk;         /* M
7ad0: 61 73 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74  ask of bits that
7ae0: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e   must be zero in
7af0: 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66   MSB of cell off
7b00: 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b  sets */.    mask
7b10: 20 3d 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e   = ~(((u8)(pBt->
7b20: 70 61 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29  pageSize>>8))-1)
7b30: 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61  ;.    pEnd = &da
7b40: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
7b50: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b  pPage->nCell*2];
7b60: 0a 20 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64  .    for(pOff=&d
7b70: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
7b80: 20 70 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21   pOff!=pEnd && !
7b90: 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20  ((*pOff)&mask); 
7ba0: 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66  pOff+=2);.    if
7bb0: 28 20 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a  ( pOff!=pEnd ){.
7bc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7bd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7bf0: 69 66 0a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  if..  pPage->isI
7c00: 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  nit = 1;.  retur
7c10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7c20: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
7c30: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
7c40: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
7c50: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
7c60: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
7c70: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
7c80: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
7c90: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
7ca0: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
7cb0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
7cc0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
7cd0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
7ce0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
7cf0: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
7d00: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  hdrOffset;.  int
7d10: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
7d20: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
7d30: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
7d40: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
7d50: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
7d60: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7d70: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
7d80: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
7d90: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
7da0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
7db0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
7dc0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
7dd0: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
7de0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
7df0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
7e00: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
7e10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7e20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
7e30: 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74  x) );.  /*memset
7e40: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
7e50: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7e60: 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61  - hdr);*/.  data
7e70: 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20  [hdr] = flags;. 
7e80: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
7e90: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
7ea0: 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65  _LEAF)==0);.  me
7eb0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
7ec0: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
7ed0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
7ee0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
7ef0: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
7f00: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
7f10: 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73  >nFree = pBt->us
7f20: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
7f30: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
7f40: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
7f50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7f60: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
7f70: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
7f80: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
7f90: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7fa0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
7fb0: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
7fc0: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37  t->pageSize<=327
7fd0: 36 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  68 );.  pPage->m
7fe0: 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70  askPage = pBt->p
7ff0: 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70  ageSize - 1;.  p
8000: 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
8010: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65   0;.  pPage->nCe
8020: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
8030: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
8040: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
8050: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
8060: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
8070: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
8080: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
8090: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
80a0: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
80b0: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
80c0: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
80d0: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
80e0: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
80f0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
8100: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
8110: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
8120: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
8130: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
8140: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
8150: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
8160: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
8170: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
8180: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
8190: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
81a0: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
81b0: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
81c0: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
81d0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
81e0: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
81f0: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
8200: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
8210: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
8220: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8230: 42 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  BtreeGetPage(.  
8240: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
8250: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
8260: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
8270: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
8280: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
8290: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
82a0: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
82b0: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
82c0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
82d0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
82e0: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
82f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
8300: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
8310: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
8320: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
8330: 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62 50 61  e *pPage;.  DbPa
8340: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
8350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8360: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8370: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
8380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
8390: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
83a0: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
83b0: 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f  *)&pDbPage, noCo
83c0: 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ntent);.  if( rc
83d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
83e0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
83f0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
8400: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
8410: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
8420: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
8430: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
8440: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
8450: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
8460: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
8470: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
8480: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
8490: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
84a0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
84b0: 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67 65 20   : 0;.  *ppPage 
84c0: 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = pPage;.  retur
84d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
84e0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
84f0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
8500: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
8510: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
8520: 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f  .** is just a co
8530: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
8540: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
8550: 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  e calls to.** sq
8560: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
8570: 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42  e() and sqlite3B
8580: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
8590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
85a0: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
85b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
85c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
85d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
85e0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
85f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8600: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
8610: 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
8620: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
8630: 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
8640: 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
8650: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
8660: 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  nt     /* Parent
8670: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
8680: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
8690: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
86a0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
86b0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
86c0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
86d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
86e0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 20  UPT_BKPT; .  }. 
86f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8700: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
8710: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
8720: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8730: 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65  E_OK && (*ppPage
8740: 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
8750: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8760: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  BtreeInitPage(*p
8770: 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
8780: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8790: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
87a0: 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
87b0: 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
87c0: 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  age = 0;.    }. 
87d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
87e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
87f0: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
8800: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
8810: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
8820: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
8830: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
8840: 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
8850: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
8860: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8870: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
8880: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
8890: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
88a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
88b0: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
88c0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
88d0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
88e0: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
88f0: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
8900: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8910: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
8920: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
8930: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
8940: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8950: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8960: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8970: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
8980: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
8990: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
89a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
89b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
89c0: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
89d0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
89e0: 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65 72 6f  .** reaches zero
89f0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 75 6e  .  We need to un
8a00: 72 65 66 20 74 68 65 20 70 50 61 72 65 6e 74 20  ref the pParent 
8a10: 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74 68 61  pointer when tha
8a20: 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f  t.** happens..*/
8a30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8a40: 65 44 65 73 74 72 75 63 74 6f 72 28 44 62 50 61  eDestructor(DbPa
8a50: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
8a60: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
8a70: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
8a80: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
8a90: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
8aa0: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
8ab0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8ac0: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73  ->isInit==0 || s
8ad0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8ae0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8af0: 74 65 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  tex) );.    if( 
8b00: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29  pPage->pParent )
8b10: 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
8b20: 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  *pParent = pPage
8b30: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  ->pParent;.     
8b40: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
8b50: 2d 3e 70 42 74 3d 3d 70 50 61 67 65 2d 3e 70 42  ->pBt==pPage->pB
8b60: 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
8b70: 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20  ->pParent = 0;. 
8b80: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
8b90: 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  (pParent);.    }
8ba0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
8bb0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  it = 0;.  }.}../
8bc0: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
8bd0: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
8be0: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
8bf0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
8c00: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
8c10: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
8c20: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
8c30: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
8c40: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
8c50: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
8c60: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
8c70: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
8c80: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8c90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
8ca0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
8cb0: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
8cc0: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
8cd0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
8ce0: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
8cf0: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
8d00: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
8d10: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
8d20: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c  t(DbPage *pData,
8d30: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
8d40: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 61 67  ;.  assert( (pag
8d60: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
8d70: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
8d80: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
8d90: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
8da0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
8db0: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
8dc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8dd0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8de0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8df0: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
8e00: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
8e10: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
8e20: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
8e30: 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rent);.  }.}../*
8e40: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
8e50: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
8e60: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
8e70: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74  ic int sqlite3Bt
8e80: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
8e90: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c  dler(void *pArg,
8ea0: 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61   int n){.  BtSha
8eb0: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
8ec0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
8ed0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
8ee0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8ef0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8f00: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
8f10: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8f20: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
8f30: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
8f40: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
8f50: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
8f60: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
8f70: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
8f80: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
8f90: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
8fa0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
8fb0: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
8fc0: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
8fd0: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
8fe0: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
8ff0: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
9000: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
9010: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
9020: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
9030: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
9040: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
9050: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
9060: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
9070: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
9080: 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
9090: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
90a0: 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
90b0: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
90c0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
90d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
90e0: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
90f0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
9100: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
9110: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
9120: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
9130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
9140: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
9150: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
9160: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
9170: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9180: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
9190: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
91a0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91c0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
91d0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
91e0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
91f0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
9200: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
9210: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
9220: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
9230: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20       /* The VFS 
9240: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
9250: 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61  btree */.  BtSha
9260: 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
9270: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
9280: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
9290: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
92a0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
92b0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
92c0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
92d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
92e0: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20   int nReserve;. 
92f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
9300: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a  DbHeader[100];..
9310: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
9320: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
9330: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
9340: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
9350: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
9360: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
9370: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
9380: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
9390: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
93a0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
93b0: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
93c0: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
93d0: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
93e0: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
93f0: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
9400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9410: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
9420: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
9430: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9440: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
9450: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
9460: 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  YDB.    const in
9470: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20  t isMemdb = 0;. 
9480: 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74   #else.    const
9490: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a   int isMemdb = z
94a0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72  Filename && !str
94b0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
94c0: 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65  :memory:");.  #e
94d0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ndif.#endif..  a
94e0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
94f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9500: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
9510: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56  >mutex) );..  pV
9520: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
9530: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
9540: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
9550: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
9560: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
9580: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
9590: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
95a0: 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64  db = db;..#if !d
95b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
95c0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
95d0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
95e0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
95f0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
9600: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
9610: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
9620: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
9630: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
9640: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
9650: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
9660: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
9670: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  */.  if( isMemdb
9680: 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66  ==0.   && (db->f
9690: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74  lags & SQLITE_Vt
96a0: 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69  ab)==0.   && zFi
96b0: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
96c0: 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20  ame[0].  ){.    
96d0: 69 66 28 20 73 71 6c 69 74 65 33 53 68 61 72 65  if( sqlite3Share
96e0: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b  dCacheEnabled ){
96f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c  .      int nFull
9700: 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
9710: 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
9720: 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c       char *zFull
9730: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
9740: 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61  e3Malloc(nFullPa
9750: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  thname);.      s
9760: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
9770: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
9780: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
9790: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
97a0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72  s |= SQLITE_Shar
97b0: 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69  edCache;.      i
97c0: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
97d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
97e0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
97f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9800: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9810: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9820: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
9830: 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
9840: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
9850: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
9860: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
9870: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
9880: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
9890: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
98a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
98b0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
98c0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
98d0: 66 6f 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53  for(pBt=sqlite3S
98e0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20  haredCacheList; 
98f0: 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
9900: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
9910: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
9920: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
9930: 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
9940: 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
9950: 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
9960: 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20  Bt->pPager)).   
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
9980: 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
9990: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
99a0: 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
99b0: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
99c0: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
99d0: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
99e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
99f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9a00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9a10: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
9a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
9a30: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
9a40: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
9a50: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9a60: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
9a70: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
9a80: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
9a90: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
9aa0: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
9ab0: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
9ac0: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
9ad0: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
9ae0: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
9af0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
9b00: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
9b10: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
9b20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9b30: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
9b40: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
9b50: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
9b60: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
9b70: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
9b80: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
9b90: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
9ba0: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
9bb0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
9bc0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
9bd0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
9be0: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
9bf0: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
9c00: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
9c10: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
9c20: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
9c30: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
9c40: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
9c50: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
9c60: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
9c70: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
9c80: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
9c90: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
9ca0: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
9cb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9cc0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
9cd0: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
9ce0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9cf0: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
9d00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9d10: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
9d20: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
9d30: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
9d40: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
9d50: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
9d60: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
9d70: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
9d80: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9d90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
9da0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
9db0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
9dc0: 74 2d 3e 62 75 73 79 48 64 72 2e 78 46 75 6e 63  t->busyHdr.xFunc
9dd0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
9de0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
9df0: 3b 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48  ;.    pBt->busyH
9e00: 64 72 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a 20  dr.pArg = pBt;. 
9e10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
9e20: 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
9e30: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
9e40: 6c 65 6e 61 6d 65 2c 20 70 61 67 65 44 65 73 74  lename, pageDest
9e50: 72 75 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  ructor,.        
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
9e80: 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a  ags, vfsFlags);.
9e90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9ea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
9eb0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
9ec0: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
9ed0: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
9ee0: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
9ef0: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
9f00: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9f10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
9f20: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
9f30: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
9f40: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
9f50: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
9f60: 67 65 72 2c 20 26 70 42 74 2d 3e 62 75 73 79 48  ger, &pBt->busyH
9f70: 64 72 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  dr);.    p->pBt 
9f80: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
9f90: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
9fa0: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
9fb0: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
9fc0: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
9fd0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
9fe0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
9ff0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
a000: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
a010: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
a020: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
a030: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
a040: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
a050: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
a060: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
a070: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
a080: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
a090: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
a0a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
a0b0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
a0c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
a0d0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20  >pageSize = 0;. 
a0e0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
a0f0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
a100: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
a110: 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64  pageSize);.#ifnd
a120: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a130: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
a140: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
a150: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
a160: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
a170: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
a180: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
a190: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
a1a0: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
a1b0: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
a1c0: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
a1d0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
a1e0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
a1f0: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
a200: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
a210: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
a220: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
a230: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
a240: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
a250: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
a260: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
a270: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
a280: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
a290: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
a2a0: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
a2b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
a2c0: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
a2d0: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
a2e0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
a2f0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
a300: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
a310: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
a320: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
a330: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
a340: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
a350: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
a360: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
a370: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
a380: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
a390: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
a3a0: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
a3b0: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
a3c0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
a3d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
a3e0: 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
a3f0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
a400: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
a410: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
a420: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
a430: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
a440: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
a450: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
a460: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
a470: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
a480: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
a490: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
a4a0: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
a4b0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
a4c0: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
a4d0: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
a4e0: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
a4f0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
a500: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
a510: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
a520: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
a530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
a540: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
a550: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a560: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
a570: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
a580: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
a590: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
a5a0: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
a5b0: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
a5c0: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
a5d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a5e0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
a5f0: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
a600: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
a610: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
a620: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
a630: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
a640: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
a650: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
a660: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
a670: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
a680: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
a690: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
a6a0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
a6b0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a6c0: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
a6d0: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
a6e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
a6f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a700: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
a710: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
a720: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
a730: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
a740: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a750: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a760: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
a770: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
a780: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71   pBt->pNext = sq
a790: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
a7a0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
a7b0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
a7c0: 73 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  st = pBt;.      
a7d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a7e0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
a7f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a800: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
a810: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a820: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
a830: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a840: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
a850: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
a860: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
a870: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
a880: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
a890: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
a8a0: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
a8b0: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
a8c0: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
a8d0: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
a8e0: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
a8f0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
a900: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
a910: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
a920: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
a930: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
a940: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
a950: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
a960: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
a970: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
a980: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
a990: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
a9a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
a9b0: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
a9c0: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
a9d0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
a9e0: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
a9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
aa00: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
aa10: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
aa20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
aa30: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
aa40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
aa50: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
aa60: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
aa70: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
aa80: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
aa90: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
aaa0: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
aab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
aac0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
aad0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
aae0: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
aaf0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
ab00: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
ab10: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
ab20: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
ab30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ab40: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
ab50: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
ab60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ab70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ab80: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
ab90: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
aba0: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
abb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
abc0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
abd0: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
abe0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
abf0: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
ac00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ac10: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
ac20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ac30: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
ac40: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
ac50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ac60: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
ac70: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
ac80: 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
ac90: 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
aca0: 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
acb0: 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
acc0: 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
acd0: 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
ace0: 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
acf0: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
ad00: 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
ad10: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
ad20: 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
ad30: 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
ad40: 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
ad50: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
ad60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ad70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad80: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ad90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ada0: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53   *pMaster;.  BtS
adb0: 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
adc0: 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
add0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
ade0: 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
adf0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
ae00: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  .  pMaster = sql
ae10: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
ae20: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
ae30: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71  IC_MASTER);.  sq
ae40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ae50: 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
ae60: 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
ae70: 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
ae80: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
ae90: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3d  SharedCacheList=
aea0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  =pBt ){.      sq
aeb0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
aec0: 4c 69 73 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  List = pBt->pNex
aed0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
aee0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
aef0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
af00: 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  st;.      while(
af10: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
af20: 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
af30: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
af40: 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
af50: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
af60: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
af70: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
af80: 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
af90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
afa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
afb0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
afc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
afd0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
afe0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
aff0: 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
b000: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
b010: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
b020: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
b030: 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
b040: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
b050: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
b060: 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
b070: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
b080: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
b090: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
b0a0: 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
b0b0: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
b0c0: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
b0d0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
b0e0: 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
b0f0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
b100: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
b110: 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
b120: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
b130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
b140: 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
b150: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
b160: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
b170: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
b180: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
b190: 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
b1a0: 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
b1b0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
b1c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
b1d0: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
b1e0: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
b1f0: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
b200: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b210: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
b220: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
b230: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
b240: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
b250: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
b260: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
b270: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
b280: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
b290: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2a0: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
b2b0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
b2c0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
b2d0: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70  >db = p->db;.  p
b2e0: 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
b2f0: 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
b300: 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
b310: 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
b320: 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
b330: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
b340: 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
b350: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b360: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
b370: 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
b380: 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
b390: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
b3a0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
b3b0: 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
b3c0: 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
b3d0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
b3e0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
b3f0: 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
b400: 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
b410: 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
b420: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
b430: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  eeRollback(p);. 
b440: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b450: 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
b460: 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
b470: 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
b480: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
b490: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
b4a0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
b4b0: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
b4c0: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
b4d0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
b4e0: 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
b4f0: 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
b500: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
b510: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
b520: 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
b530: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
b540: 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
b550: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
b560: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
b570: 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
b580: 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
b590: 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
b5a0: 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
b5b0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
b5c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
b5d0: 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
b5e0: 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
b5f0: 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
b600: 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
b610: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
b620: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
b630: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
b640: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
b650: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
b660: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
b670: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
b680: 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
b690: 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
b6a0: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
b6b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
b6c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
b6d0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
b6e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
b6f0: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
b700: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b710: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
b720: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
b730: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
b740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
b750: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
b760: 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
b770: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
b780: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
b790: 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
b7a0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
b7b0: 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
b7c0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
b7d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b7e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
b7f0: 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
b800: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
b810: 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
b820: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
b830: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
b840: 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
b850: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
b860: 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
b870: 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
b880: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
b890: 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
b8a0: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
b8b0: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
b8c0: 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
b8d0: 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
b8e0: 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
b8f0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
b900: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
b910: 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
b920: 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
b930: 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
b940: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
b950: 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
b960: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
b970: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
b980: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
b990: 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
b9a0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
b9b0: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
b9c0: 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
b9d0: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
b9e0: 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
b9f0: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
ba00: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
ba10: 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
ba20: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
ba30: 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
ba40: 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
ba50: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
ba60: 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
ba70: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
ba80: 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
ba90: 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
baa0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
bab0: 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
bac0: 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
bad0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
bae0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
baf0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
bb00: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
bb10: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
bb20: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
bb30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
bb40: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
bb50: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
bb60: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
bb70: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
bb80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bb90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
bba0: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
bbb0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
bbc0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
bbd0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
bbe0: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
bbf0: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
bc00: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
bc10: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
bc20: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
bc30: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
bc40: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
bc50: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
bc60: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
bc70: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
bc80: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
bc90: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
bca0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
bcb0: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
bcc0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
bcd0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
bce0: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
bcf0: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
bd00: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
bd10: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
bd20: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
bd30: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
bd40: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
bd50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bd60: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
bd70: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
bd80: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
bd90: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
bda0: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
bdb0: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
bdc0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
bdd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bde0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
bdf0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
be00: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
be10: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
be20: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
be30: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
be40: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
be50: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
be60: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
be70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
be80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
be90: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
bea0: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
beb0: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
bec0: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
bed0: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
bee0: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
bef0: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
bf00: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
bf10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
bf20: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
bf30: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
bf40: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
bf50: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
bf60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
bf70: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
bf80: 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
bf90: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
bfa0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
bfb0: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
bfc0: 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
bfd0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
bfe0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
bff0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c000: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c010: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
c020: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
c030: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
c040: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c050: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
c060: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
c070: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
c080: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
c090: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
c0a0: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s per page..**.*
c0b0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
c0c0: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
c0d0: 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
c0e0: 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
c0f0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
c100: 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
c110: 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
c120: 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
c130: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
c140: 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
c150: 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
c160: 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
c170: 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
c180: 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
c190: 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
c1a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
c1b0: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
c1c0: 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
c1d0: 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
c1e0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
c1f0: 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
c200: 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
c210: 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
c220: 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
c230: 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
c240: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
c250: 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
c260: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
c270: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
c280: 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
c290: 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
c2a0: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
c2b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c2c0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
c2d0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
c2e0: 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
c2f0: 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
c300: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
c310: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
c320: 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
c330: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
c340: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
c350: 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  Fixed ){.    sql
c360: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
c370: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c380: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
c390: 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
c3a0: 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
c3b0: 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
c3c0: 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
c3d0: 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eSize;.  }.  if(
c3e0: 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
c3f0: 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
c400: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
c410: 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
c420: 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
c430: 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
c440: 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
c450: 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
c460: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
c470: 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
c480: 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
c490: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
c4a0: 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
c4b0: 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
c4c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
c4d0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
c4e0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
c4f0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
c500: 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
c510: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
c520: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
c530: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c540: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c550: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
c560: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
c570: 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
c580: 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
c590: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
c5a0: 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
c5b0: 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
c5c0: 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73  ageSize;.}.int s
c5d0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
c5e0: 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
c5f0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
c600: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
c610: 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
c620: 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
c630: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
c640: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c650: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c660: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
c670: 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
c680: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
c690: 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
c6a0: 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
c6b0: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
c6c0: 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
c6d0: 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
c6e0: 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
c6f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
c700: 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
c710: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
c720: 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
c730: 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
c740: 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
c750: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
c760: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
c770: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
c780: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
c790: 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
c7a0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
c7b0: 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
c7c0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
c7d0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69  eturn n;.}.#endi
c7e0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
c7f0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
c800: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
c810: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c820: 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
c830: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
c840: 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
c850: 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
c860: 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
c870: 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
c880: 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
c890: 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
c8a0: 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
c8b0: 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
c8c0: 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
c8d0: 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
c8e0: 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
c8f0: 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
c900: 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
c910: 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
c920: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
c930: 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
c940: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
c950: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
c960: 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
c970: 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
c980: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
c990: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
c9a0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
c9b0: 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
c9c0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
c9d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c9e0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20  _OK;.  int av = 
c9f0: 28 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29  (autoVacuum?1:0)
ca00: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
ca10: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
ca20: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
ca30: 78 65 64 20 26 26 20 61 76 21 3d 70 42 74 2d 3e  xed && av!=pBt->
ca40: 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
ca50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
ca60: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
ca70: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
ca80: 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20  cuum = av;.  }. 
ca90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
caa0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
cab0: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
cac0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
cad0: 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
cae0: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
caf0: 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
cb00: 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
cb10: 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
cb20: 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
cb30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
cb40: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
cb50: 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
cb60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
cb70: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
cb80: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
cb90: 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
cba0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
cbb0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
cbc0: 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
cbd0: 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
cbe0: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
cbf0: 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
cc00: 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
cc10: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
cc20: 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
cc30: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
cc40: 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
cc50: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
cc60: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
cc70: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
cc80: 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
cc90: 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
cca0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
ccb0: 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
ccc0: 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
ccd0: 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
cce0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
ccf0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
cd00: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
cd10: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
cd20: 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
cd30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cd40: 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
cd50: 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
cd60: 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
cd70: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
cd80: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
cd90: 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
cda0: 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
cdb0: 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
cdc0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
cdd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
cde0: 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
cdf0: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
ce00: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
ce10: 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
ce20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ce30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ce40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
ce50: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
ce60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ce70: 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  K;.  rc = sqlite
ce80: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
ce90: 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
cea0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ceb0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
cec0: 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
ced0: 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
cee0: 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
cef0: 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
cf00: 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
cf10: 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
cf20: 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
cf30: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
cf40: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
cf50: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
cf60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cf70: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
cf80: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
cf90: 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65   }else if( nPage
cfa0: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61  >0 ){.    int pa
cfb0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  geSize;.    int 
cfc0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
cfd0: 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
cfe0: 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
cff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
d000: 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
d010: 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
d020: 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
d030: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
d040: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
d050: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
d060: 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
d070: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
d080: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
d090: 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
d0a0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
d0b0: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
d0c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
d0d0: 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
d0e0: 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
d0f0: 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
d100: 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
d110: 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
d120: 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
d130: 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
d140: 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
d150: 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
d160: 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
d170: 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
d180: 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
d190: 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
d1a0: 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
d1b0: 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
d1c0: 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
d1d0: 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
d1e0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
d1f0: 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
d200: 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
d210: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d220: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d230: 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
d240: 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67   = get2byte(&pag
d250: 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  e1[16]);.    if(
d260: 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
d270: 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70  ageSize)!=0 || p
d280: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20  ageSize<512 ||. 
d290: 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d         (SQLITE_M
d2a0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37  AX_PAGE_SIZE<327
d2b0: 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53  68 && pageSize>S
d2c0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
d2d0: 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  IZE).    ){.    
d2e0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d2f0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
d300: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
d310: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
d320: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
d330: 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
d340: 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
d350: 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
d360: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
d370: 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
d380: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
d390: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d3a0: 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
d3b0: 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
d3c0: 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
d3d0: 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
d3e0: 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
d3f0: 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
d400: 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
d410: 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
d420: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
d430: 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
d440: 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
d450: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
d460: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
d470: 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
d480: 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
d490: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
d4a0: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
d4b0: 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
d4c0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
d4d0: 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
d4e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
d4f0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
d500: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
d510: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
d520: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
d530: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71  e(pBt);.      sq
d540: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
d550: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
d560: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
d570: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
d580: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d590: 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  }.    if( usable
d5a0: 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20  Size<500 ){.    
d5b0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
d5c0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
d5d0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
d5e0: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
d5f0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
d600: 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
d610: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d620: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
d630: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
d640: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
d650: 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
d660: 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
d670: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
d680: 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
d690: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
d6a0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
d6b0: 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
d6c0: 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
d6d0: 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
d6e0: 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
d6f0: 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
d700: 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
d710: 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
d720: 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
d730: 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
d740: 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
d750: 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
d760: 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
d770: 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
d780: 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
d790: 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
d7a0: 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
d7b0: 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
d7c0: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
d7d0: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
d7e0: 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
d7f0: 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
d800: 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
d810: 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
d820: 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
d830: 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
d840: 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
d850: 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
d860: 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
d870: 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  iner, a header w
d880: 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
d890: 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
d8a0: 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
d8b0: 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
d8c0: 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
d8d0: 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
d8e0: 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
d8f0: 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
d900: 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  axLocal = (pBt->
d910: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
d920: 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  4/255 - 23;.  pB
d930: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70  t->minLocal = (p
d940: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
d950: 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
d960: 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
d970: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
d980: 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 35;.  pBt->mi
d990: 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73  nLeaf = (pBt->us
d9a0: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
d9b0: 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65  255 - 23;.  asse
d9c0: 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
d9d0: 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
d9e0: 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
d9f0: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
da00: 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53  age1;.  return S
da10: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
da20: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
da30: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
da40: 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
da50: 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
da60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
da70: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
da80: 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28   like lockBtree(
da90: 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  ) except that it
daa0: 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68   also invokes th
dab0: 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61  e.** busy callba
dac0: 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 6c  ck if there is l
dad0: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a  ock contention..
dae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
daf0: 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
db00: 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20  (Btree *pRef){. 
db10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
db20: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
db30: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
db40: 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a  sMutex(pRef) );.
db50: 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72    if( pRef->inTr
db60: 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
db70: 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e  ){.    u8 inTran
db80: 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e  saction = pRef->
db90: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
dba0: 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74  on;.    btreeInt
dbb0: 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
dbc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
dbd0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52  reeBeginTrans(pR
dbe0: 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66  ef, 0);.    pRef
dbf0: 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
dc00: 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63  tion = inTransac
dc10: 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e  tion;.    pRef->
dc20: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
dc30: 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63  NONE;.    if( rc
dc40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
dc50: 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e       pRef->pBt->
dc60: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
dc70: 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49      }.    btreeI
dc80: 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a  ntegrity(pRef);.
dc90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dca0: 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a  .}.       ../*.*
dcb0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
dcc0: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
dcd0: 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
dce0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
dcf0: 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
dd00: 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
dd10: 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
dd20: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
dd30: 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
dd40: 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
dd50: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
dd60: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
dd70: 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
dd80: 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
dd90: 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
dda0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
ddb0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74  here are any out
ddc0: 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
ddd0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
dde0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
ddf0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
de00: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
de10: 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
de20: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
de30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
de40: 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
de50: 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
de60: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
de70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
de80: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
de90: 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
dea0: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
deb0: 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75  NONE && pBt->pCu
dec0: 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e  rsor==0 && pBt->
ded0: 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
dee0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
def0: 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
df00: 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20  Pager)>=1 ){.   
df10: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
df20: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
df30: 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69 66 28  .#if 0.      if(
df40: 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
df50: 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
df60: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
df70: 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
df80: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61          pPage->a
df90: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
dfa0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
dfb0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
dfc0: 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
dfd0: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50   pBt;.        pP
dfe0: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  age->pgno = 1;. 
dff0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
e000: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
e010: 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
e020: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61    }.    pBt->pPa
e030: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
e040: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
e050: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
e060: 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
e070: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
e080: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
e090: 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a  of the.** file..
e0a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
e0b0: 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
e0c0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
e0d0: 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
e0e0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
e0f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
e100: 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72   nPage;..  asser
e110: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e120: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
e130: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
e140: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
e150: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
e160: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
e170: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e  !=SQLITE_OK || n
e180: 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
e190: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
e1a0: 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
e1b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
e1c0: 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
e1d0: 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
e1e0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
e1f0: 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
e200: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
e210: 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
e220: 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
e230: 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
e240: 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
e250: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
e260: 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
e270: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
e280: 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61  ata[16], pBt->pa
e290: 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
e2a0: 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
e2b0: 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  19] = 1;.  data[
e2c0: 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  20] = pBt->pageS
e2d0: 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
e2e0: 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31  eSize;.  data[21
e2f0: 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
e300: 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
e310: 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
e320: 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
e330: 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
e340: 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
e350: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
e360: 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
e370: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
e380: 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
e390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e3a0: 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
e3b0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
e3c0: 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
e3d0: 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
e3e0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
e3f0: 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
e400: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
e410: 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
e420: 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
e430: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
e440: 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
e450: 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
e460: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
e470: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
e480: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e490: 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
e4a0: 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
e4b0: 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
e4c0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
e4d0: 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
e4e0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
e4f0: 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
e500: 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
e510: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
e520: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
e530: 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
e540: 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
e550: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
e560: 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
e570: 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
e580: 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
e590: 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
e5a0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
e5b0: 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
e5c0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
e5d0: 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
e5e0: 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
e5f0: 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
e600: 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
e610: 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
e620: 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
e630: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
e640: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
e650: 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
e660: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
e670: 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
e680: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
e690: 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
e6a0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
e6b0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
e6c0: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
e6d0: 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
e6e0: 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
e6f0: 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
e700: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
e710: 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
e720: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
e730: 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
e740: 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
e750: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e760: 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
e770: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
e780: 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
e790: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
e7a0: 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
e7b0: 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
e7c0: 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
e7d0: 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
e7e0: 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
e7f0: 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
e800: 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
e810: 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
e820: 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
e830: 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
e840: 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
e850: 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
e860: 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
e870: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
e880: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
e890: 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
e8a0: 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
e8b0: 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
e8c0: 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
e8d0: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
e8e0: 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
e8f0: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
e900: 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
e910: 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
e920: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
e930: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
e940: 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
e950: 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
e960: 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
e970: 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
e980: 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
e990: 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
e9a0: 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
e9b0: 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
e9c0: 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
e9d0: 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
e9e0: 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
e9f0: 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
ea00: 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
ea10: 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
ea20: 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
ea30: 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
ea40: 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
ea50: 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
ea60: 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
ea70: 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
ea80: 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
ea90: 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
eaa0: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
eab0: 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
eac0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
ead0: 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
eae0: 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
eaf0: 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
eb00: 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
eb10: 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
eb20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
eb30: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
eb40: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
eb50: 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65  flag){.  BtShare
eb60: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
eb70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
eb80: 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
eb90: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
eba0: 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
ebb0: 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  b;.  btreeIntegr
ebc0: 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
ebd0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
ebe0: 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
ebf0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
ec00: 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
ec10: 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
ec20: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
ec30: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
ec40: 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
ec50: 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
ec60: 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
ec70: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
ec80: 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
ec90: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
eca0: 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
ecb0: 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
ecc0: 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
ecd0: 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
ece0: 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
ecf0: 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
ed00: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
ed10: 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64  .  if( pBt->read
ed20: 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29  Only && wrflag )
ed30: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ed40: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
ed50: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
ed60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
ed70: 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
ed80: 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
ed90: 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
eda0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
edb0: 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
edc0: 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
edd0: 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
ede0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
edf0: 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
ee00: 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
ee10: 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  TE_BUSY..  */.  
ee20: 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
ee30: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
ee40: 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29 7b  ITE && wrflag ){
ee50: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
ee60: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
ee70: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
ee80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ee90: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
eea0: 48 45 0a 20 20 69 66 28 20 77 72 66 6c 61 67 3e  HE.  if( wrflag>
eeb0: 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
eec0: 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
eed0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
eee0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
eef0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
ef00: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
ef10: 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
ef20: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ef30: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67 6f  BUSY;.        go
ef40: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
ef50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ef60: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b  }.#endif..  do {
ef70: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50  .    if( pBt->pP
ef80: 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age1==0 ){.     
ef90: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20   do{.        rc 
efa0: 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
efb0: 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
efc0: 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
efd0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
efe0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
eff0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f000: 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
f010: 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
f020: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
f030: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
f040: 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
f050: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
f060: 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
f070: 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  n(pBt->pPage1->p
f080: 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67 3e 31  DbPage, wrflag>1
f090: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
f0a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f0b0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
f0c0: 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
f0d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f0e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
f0f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f100: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  K ){.      if( w
f110: 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e 53  rflag ) pBt->inS
f120: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
f130: 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b  se{.      unlock
f140: 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
f150: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
f160: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
f170: 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
f180: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
f190: 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
f1a0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
f1b0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
f1c0: 28 70 42 74 2c 20 30 29 20 29 3b 0a 0a 20 20 69  (pBt, 0) );..  i
f1d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f1e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
f1f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
f200: 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
f210: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
f220: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
f230: 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
f240: 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
f250: 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
f260: 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
f270: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
f280: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
f290: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
f2a0: 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23  inTrans;.    }.#
f2b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f2c0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
f2d0: 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
f2e0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f2f0: 28 20 21 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  ( !pBt->pExclusi
f300: 76 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ve );.      pBt-
f310: 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20 70 3b  >pExclusive = p;
f320: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f330: 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a  }...trans_begun:
f340: 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
f350: 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
f360: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
f370: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f380: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
f390: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
f3a0: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
f3b0: 73 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31  s.  Or return -1
f3c0: 20 69 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20   if.** there is 
f3d0: 61 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  any kind of erro
f3e0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f3f0: 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
f400: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
f410: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
f420: 6e 50 61 67 65 3b 0a 20 20 72 63 20 3d 20 73 71  nPage;.  rc = sq
f430: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
f440: 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
f450: 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  ge);.  return (r
f460: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 6e 50 61  c==SQLITE_OK?nPa
f470: 67 65 3a 2d 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  ge:-1);.}...#ifn
f480: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f490: 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
f4a0: 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
f4b0: 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
f4c0: 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
f4d0: 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
f4e0: 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
f4f0: 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
f500: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
f510: 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
f520: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
f530: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
f540: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
f550: 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
f560: 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
f570: 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
f580: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
f590: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
f5c0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
f5d0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f5f0: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
f600: 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
f610: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f640: 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
f650: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
f660: 70 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69  pBt;.  int isIni
f670: 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
f680: 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
f690: 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
f6a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
f6b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f6c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f6d0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
f6e0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
f6f0: 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
f700: 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
f710: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f720: 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
f730: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
f740: 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
f750: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
f760: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
f770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
f780: 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
f790: 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
f7a0: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
f7b0: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
f7c0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
f7d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f7e0: 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
f7f0: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
f800: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
f810: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
f820: 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
f830: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
f840: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
f850: 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
f860: 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
f870: 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
f880: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
f890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
f8a0: 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
f8b0: 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  aps_out;.    }. 
f8c0: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
f8d0: 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
f8e0: 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
f8f0: 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
f900: 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
f910: 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
f920: 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
f930: 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
f940: 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
f950: 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  o);.  }..set_chi
f960: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
f970: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
f980: 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
f990: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f9a0: 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
f9b0: 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73   pPage, which is
f9c0: 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
f9d0: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20  e a btree page, 
f9e0: 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a  not an overflow.
f9f0: 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f  ** page, is a po
fa00: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
fa10: 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73  rom. Modify this
fa20: 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74   pointer so that
fa30: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
fa40: 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
fa50: 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
fa60: 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
fa70: 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  ter to be modifi
fa80: 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f  ed, as .** follo
fa90: 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
faa0: 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
fab0: 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
fac0: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
fad0: 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
fae0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
faf0: 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
fb00: 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
fb10: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
fb20: 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
fb30: 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
fb40: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
fb50: 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
fb70: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
fb80: 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
fb90: 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
fba0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
fbb0: 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
fbc0: 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
fbd0: 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
fbe0: 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
fc10: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
fc20: 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
fc30: 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
fc40: 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
fc50: 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
fc60: 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
fc70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fc80: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
fc90: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
fca0: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
fcb0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
fcc0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
fcd0: 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
fce0: 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
fcf0: 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
fd00: 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
fd10: 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
fd20: 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
fd30: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
fd40: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fd50: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
fd60: 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
fd70: 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
fd80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
fd90: 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
fda0: 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
fdb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
fdc0: 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69  nCell;..    sqli
fdd0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
fde0: 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  (pPage, 0);.    
fdf0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
fe00: 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
fe10: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
fe20: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
fe30: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
fe40: 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
fe50: 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
fe60: 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
fe70: 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
fe80: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nfo;.        sql
fe90: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
fea0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
feb0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
fec0: 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
fed0: 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
fee0: 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
fef0: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
ff00: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
ff10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
ff20: 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
ff30: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
ff40: 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
ff50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ff60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
ff70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ff80: 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
ff90: 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
ffa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
ffb0: 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
ffc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
ffd0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
ffe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
fff0: 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
10000 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
10010 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
10020 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
10030 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
10040 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
10050 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
10060 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10070 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10080 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
10090 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
100a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
100b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
100c0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
100d0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
100e0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
100f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
10100 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
10110 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
10120 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
10130 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
10140 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
10150 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
10160 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
10170 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
10180 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
10190 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
101a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
101b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
101c0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
101d0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
101e0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
101f0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
10200 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
10210 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
10220 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
10230 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
10240 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
10250 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
10260 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
10270 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
10280 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
10290 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
102a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
102b0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
102c0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
102d0 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d   isCommit.){.  M
102e0 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
102f0 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
10300 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
10310 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
10320 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
10330 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
10340 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
10350 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
10360 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
10370 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
10380 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
10390 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
103a0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
103b0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
103c0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
103d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
103e0 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
103f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10400 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
10420 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
10430 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
10440 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
10450 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
10460 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
10470 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
10480 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
10490 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
104a0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
104b0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
104c0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
104d0 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
104e0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
104f0 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
10500 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
10510 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
10520 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
10530 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
10540 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
10550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10560 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10570 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
10580 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
10590 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
105a0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
105b0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
105c0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
105d0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
105e0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
105f0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
10600 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
10610 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
10620 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
10630 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
10640 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
10650 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
10660 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
10670 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
10680 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
10690 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
106a0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
106b0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
106c0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
106d0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
106e0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
106f0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
10700 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
10710 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
10720 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
10730 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
10740 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
10750 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
10760 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
10770 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
10780 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
107a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
107b0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
107c0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
107d0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
107e0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
107f0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
10800 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
10810 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
10820 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
10830 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
10840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10870 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10880 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
10890 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
108a0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
108b0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
108c0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
108d0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
108e0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
108f0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
10900 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
10910 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
10920 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
10930 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
10940 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
10950 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
10960 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
10970 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
10980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
109a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
109b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
109c0 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
109d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
109e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
109f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
10a00 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
10a10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
10a20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
10a30 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
10a40 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
10a50 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
10a60 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
10a70 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
10a80 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
10a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10aa0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
10ab0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
10ac0 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
10ad0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
10ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10af0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
10b00 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
10b10 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
10b20 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
10b30 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
10b40 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
10b50 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
10b60 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
10b70 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
10b80 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
10b90 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
10ba0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
10bb0 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
10bc0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
10bd0 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
10be0 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
10bf0 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
10c00 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
10c10 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
10c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10c30 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
10c40 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
10c50 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
10c60 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
10c70 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
10c80 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
10c90 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
10ca0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
10cb0 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
10cc0 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
10cd0 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
10ce0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
10cf0 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d  zero, the implem
10d00 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  entation assumes
10d10 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c  .** that the cal
10d20 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
10d30 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
10d40 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20  Step() until.** 
10d50 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
10d60 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72  E_DONE or an err
10d70 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69  or, and that nFi
10d80 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  n is the.** numb
10d90 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20  er of pages the 
10da0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
10db0 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72  ll contain after
10dc0 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73   this .** proces
10dd0 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  s is complete..*
10de0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
10df0 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
10e00 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
10e10 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c  nFin){.  Pgno iL
10e20 61 73 74 50 67 3b 20 20 20 20 20 20 20 20 20 20  astPg;          
10e30 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
10e40 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
10e50 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  */.  Pgno nFreeL
10e60 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
10e70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
10e80 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
10e90 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
10ea0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10eb0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10ec0 75 74 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74  utex) );.  iLast
10ed0 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  Pg = pBt->nTrunc
10ee0 3b 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d  ;.  if( iLastPg=
10ef0 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
10f00 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  g = pagerPagecou
10f10 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
10f20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50 54 52  .  }..  if( !PTR
10f30 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
10f40 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
10f50 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
10f60 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
10f70 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
10f80 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
10f90 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
10fa0 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
10fb0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
10fc0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
10fd0 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
10fe0 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c  t==0 || nFin==iL
10ff0 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72  astPg ){.      r
11000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
11010 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
11020 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
11030 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
11040 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
11050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
11070 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
11080 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
11090 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
110a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
110b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
110c0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
110d0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
110e0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
110f0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
11100 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
11110 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
11120 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
11130 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
11140 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
11150 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
11160 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
11170 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
11180 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
11190 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
111a0 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
111b0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
111c0 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
111d0 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
111e0 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
111f0 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
11200 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
11210 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
11220 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
11230 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
11240 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
11250 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
11260 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
11270 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
11280 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
11290 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
112a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
112b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
112c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
112d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
112e0 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
112f0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
11300 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
11310 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11320 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
11330 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
11340 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11350 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
11360 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
11370 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
11380 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
11390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
113a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
113b0 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
113c0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
113d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
113e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
113f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
11400 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20       /* If nFin 
11410 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
11420 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
11430 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
11440 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
11450 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
11460 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
11470 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
11480 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
11490 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
114a0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
114b0 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65  , if nFin is gre
114c0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
114d0 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
114e0 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
114f0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
11500 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
11510 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
11520 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
11530 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
11540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
11550 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
11560 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
11570 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
11580 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
11590 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
115a0 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eePg, 0, 0);.   
115b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
115c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
115d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
115e0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
115f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11610 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
11620 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
11630 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20  ile( nFin!=0 && 
11640 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
11650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
11660 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
11670 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
11680 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
11690 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44  rite(pLastPg->pD
116a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
116b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
116c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
116d0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
116e0 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
116f0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
11700 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20  ePg, nFin!=0);. 
11710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
11720 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
11730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11750 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11770 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e   }..  pBt->nTrun
11780 63 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b  c = iLastPg - 1;
11790 0a 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e  .  while( pBt->n
117a0 54 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42  Trunc==PENDING_B
117b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
117c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
117d0 2c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29  , pBt->nTrunc) )
117e0 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e  {.    pBt->nTrun
117f0 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c--;.  }.  retur
11800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11810 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
11820 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
11830 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
11840 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
11850 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
11860 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
11870 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
11880 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
11890 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
118a0 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
118b0 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
118c0 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
118d0 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
118e0 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
118f0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
11900 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
11910 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
11920 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20  ror occured,.** 
11930 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11940 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
11950 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
11960 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
11970 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
11980 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
11990 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
119a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
119b0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
119c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
119d0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
119e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
119f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
11a00 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
11a10 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11a20 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
11a30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
11a40 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11a50 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
11a60 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
11a70 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
11a80 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
11a90 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
11aa0 42 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  Bt, 0);.  }.  sq
11ab0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11ac0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
11ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11ae0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11af0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
11b00 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
11b10 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
11b20 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
11b30 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
11b40 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
11b50 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
11b60 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
11b70 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
11b80 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
11b90 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
11ba0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
11bb0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
11bc0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
11bd0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
11be0 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
11bf0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
11c00 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
11c10 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
11c20 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
11c30 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
11c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
11c50 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
11c60 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
11c70 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69  o *pnTrunc){.  i
11c80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11c90 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
11ca0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
11cb0 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
11cc0 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  .  int nRef = sq
11cd0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
11ce0 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64  nt(pPager);.#end
11cf0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  if..  assert( sq
11d00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11d10 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11d20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
11d30 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
11d40 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
11d50 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
11d60 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
11d70 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
11d80 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20   nFin = 0;..    
11d90 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d  if( pBt->nTrunc=
11da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  =0 ){.      Pgno
11db0 20 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 50 67   nFree;.      Pg
11dc0 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20  no nPtrmap;.    
11dd0 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
11de0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
11df0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 69  ;.      int nOri
11e00 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  g = pagerPagecou
11e10 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
11e20 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  ..      if( PTRM
11e30 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
11e40 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20 20  Orig) ){.       
11e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11e60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11e70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
11e80 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
11e90 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
11ea0 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d 3b          nOrig--;
11eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
11ec0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
11ed0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
11ee0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20 20  ata[36]);.      
11ef0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
11f00 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
11f10 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
11f20 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35  +pgsz/5)/(pgsz/5
11f30 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d 20  );.      nFin = 
11f40 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
11f50 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 69  nPtrmap;.      i
11f60 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
11f70 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
11f80 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47  && nFin<=PENDING
11f90 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
11fa0 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e 2d  ){.        nFin-
11fb0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
11fc0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
11fd0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
11fe0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
11ff0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
12000 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e   ){.        nFin
12010 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
12020 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  }..    while( rc
12030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12040 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
12050 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
12060 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
12070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
12080 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  NE ){.      asse
12090 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70 42  rt(nFin==0 || pB
120a0 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c 20  t->nTrunc==0 || 
120b0 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75 6e  nFin<=pBt->nTrun
120c0 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  c);.      rc = S
120d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
120e0 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
120f0 26 26 20 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  && nFin ){.     
12100 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12110 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
12120 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
12130 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
12140 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
12150 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
12160 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
12170 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
12180 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
12190 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63       pBt->nTrunc
121a0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
121b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
121c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
121d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
121e0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
121f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
12200 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12210 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72 75  OK ){.    *pnTru
12220 6e 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  nc = pBt->nTrunc
12230 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e  ;.    pBt->nTrun
12240 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  c = 0;.  }.  ass
12250 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74  ert( nRef==sqlit
12260 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
12270 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
12280 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
12290 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
122a0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
122b0 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
122c0 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
122d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
122e0 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
122f0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
12300 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
12310 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
12320 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
12330 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
12340 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
12350 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
12360 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
12370 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
12380 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
12390 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
123a0 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
123b0 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
123c0 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
123d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
123e0 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
123f0 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
12400 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
12410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12420 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
12430 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
12440 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
12450 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
12460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12470 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
12480 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
12490 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
124a0 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
124b0 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
124c0 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
124d0 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
124e0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
124f0 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
12500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
12510 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
12520 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
12530 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f 72  treeCommit() for
12540 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
12550 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
12560 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
12570 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
12580 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
12590 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
125a0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
125b0 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
125c0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
125d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
125e0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
125f0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
12600 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
12610 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
12620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
12630 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
12640 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
12650 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
12660 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
12670 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
12680 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
12690 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
126a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
126b0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
126c0 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
126d0 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
126e0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
126f0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
12700 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
12710 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
12720 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
12730 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
12740 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
12750 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
12760 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
12770 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
12780 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
12790 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
127a0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
127b0 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
127c0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
127d0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
127e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
127f0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
12800 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
12810 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
12820 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12830 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
12840 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
12850 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
12860 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12870 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20 3d     Pgno nTrunc =
12880 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
12890 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
128a0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
128b0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
128c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
128d0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
128e0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
128f0 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
12900 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26 6e  umCommit(pBt, &n
12910 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20 69  Trunc); .      i
12920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12930 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12940 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12950 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
12960 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
12970 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
12980 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
12990 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
129a0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
129b0 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b 0a  er, nTrunc, 0);.
129c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
129d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
129e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
129f0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
12a00 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
12a10 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
12a20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12a30 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
12a40 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
12a50 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
12a60 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
12a70 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29  lite3BtreeSync()
12a80 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
12a90 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
12aa0 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  d should be invo
12ab0 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ked.** prior to 
12ac0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
12ad0 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
12ae0 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f  e3BtreeSync() ro
12af0 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c 6c  utine did.** all
12b00 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
12b10 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
12b20 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
12b30 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
12b40 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
12b50 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
12b60 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
12b70 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
12b80 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
12b90 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
12ba0 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
12bb0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12bc0 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63 61  nal.** (which ca
12bd0 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
12be0 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
12bf0 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  and drop locks..
12c00 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
12c10 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
12c20 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
12c30 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
12c40 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
12c50 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
12c60 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
12c70 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
12c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12c90 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
12ca0 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  wo(Btree *p){.  
12cb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12cc0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
12cd0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12ce0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
12cf0 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
12d00 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
12d10 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
12d20 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
12d30 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
12d40 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
12d50 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
12d60 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
12d70 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
12d80 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
12d90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
12da0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
12db0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
12dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12dd0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
12de0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
12df0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12e00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
12e10 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12e20 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
12e30 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
12e40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
12e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12e60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
12e70 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
12e80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12e90 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
12ea0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
12eb0 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  EAD;.    pBt->in
12ec0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
12ed0 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
12ee0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
12ef0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
12f00 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
12f10 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
12f20 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
12f30 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
12f40 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
12f50 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
12f60 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
12f70 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
12f80 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
12f90 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
12fa0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
12fb0 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
12fc0 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
12fd0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
12fe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12ff0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
13000 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ONE ){.    pBt->
13010 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
13020 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
13030 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
13040 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
13050 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
13060 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
13070 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68  ..  /* Set the h
13080 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74  andles current t
13090 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
130a0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
130b0 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
130c0 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
130d0 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
130e0 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
130f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
13100 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72 61  .  */.  p->inTra
13110 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
13120 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
13130 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
13140 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
13150 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13160 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13180 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
13190 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
131a0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
131b0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
131c0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
131d0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
131e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
131f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
13200 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
13210 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
13220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13230 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13240 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
13250 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13260 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
13280 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
13290 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
132a0 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
132b0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
132c0 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
132d0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
132e0 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
132f0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
13300 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
13310 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
13320 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
13330 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
13340 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
13350 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73  ne, a write-curs
13360 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
13370 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
13380 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74  ble of writing t
13390 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20  o the databse.  
133a0 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  That means the c
133b0 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69  ursor was.** ori
133c0 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ginally opened f
133d0 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74  or writing and t
133e0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  he cursor has no
133f0 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a  t be disabled.**
13400 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73   by having its s
13410 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20  tate changed to 
13420 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f  CURSOR_FAULT..*/
13430 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
13440 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74  tWriteCursors(Bt
13450 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
13460 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
13470 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
13480 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
13490 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
134a0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
134b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46     if( pCur->wrF
134c0 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74  lag && pCur->eSt
134d0 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
134e0 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
134f0 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
13500 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
13510 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
13520 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
13530 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
13540 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
13550 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
13560 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
13570 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
13580 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
13590 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
135a0 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
135b0 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
135c0 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
135d0 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
135e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
135f0 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
13600 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
13610 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
13620 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13630 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
13640 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
13650 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
13660 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
13670 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
13680 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
13690 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
136a0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
136b0 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
136c0 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
136d0 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
136e0 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
136f0 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
13700 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
13710 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
13720 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
13730 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
13740 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
13750 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
13760 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
13770 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13780 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
13790 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
137a0 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
137b0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
137c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
137d0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
137e0 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
137f0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
13800 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63  p->pNext){.    c
13810 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
13820 6f 6e 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  on(p);.    p->eS
13830 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
13840 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
13850 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a   = errCode;.  }.
13860 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13870 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a  ave(pBtree);.}..
13880 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
13890 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
138a0 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c  n progress.  All
138b0 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
138c0 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79  .** invalided by
138d0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
138e0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
138f0 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a   use a cursor.**
13900 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
13910 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
13920 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
13930 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a  n will result.**
13940 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   in an error..**
13950 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
13960 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
13970 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
13980 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
13990 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
139a0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
139b0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
139c0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
139d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
139e0 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65  eeRollback(Btree
139f0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
13a00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13a10 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
13a20 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
13a30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13a40 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
13a50 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20  = p->db;.  rc = 
13a60 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
13a70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  Bt, 0, 0);.#ifnd
13a80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
13a90 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
13aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13ab0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
13ac0 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74  s a horrible sit
13ad0 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72  uation. An IO or
13ae0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
13af0 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a 20  occured whilst. 
13b00 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20     ** trying to 
13b10 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69  save cursor posi
13b20 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69  tions. If this i
13b30 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72  s an automatic r
13b40 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20  ollback (as.    
13b50 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ** the result of
13b60 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d   a constraint, m
13b70 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20  alloc() failure 
13b80 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65  or IO error) the
13b90 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  n .    ** the ca
13ba0 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72  che may be inter
13bb0 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
13bc0 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  nt (not contain 
13bd0 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a  valid trees) so.
13be0 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74      ** we cannot
13bf0 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74   simply return t
13c00 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  he error to the 
13c10 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c  caller. Instead,
13c20 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61   abort .    ** a
13c30 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20  ll queries that 
13c40 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79  may be using any
13c50 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
13c60 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73  that failed to s
13c70 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ave..    */.    
13c80 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
13c90 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63  AllCursors(p, rc
13ca0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
13cb0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
13cc0 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61  );.  unlockAllTa
13cd0 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28 20  bles(p);..  if( 
13ce0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13cf0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
13d00 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65 66  nt rc2;..#ifndef
13d10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13d20 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
13d30 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65 6e  >nTrunc = 0;.#en
13d40 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28  dif..    assert(
13d50 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
13d60 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13d70 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
13d80 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
13d90 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
13da0 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
13db0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13dc0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
13dd0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
13de0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
13df0 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
13e00 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
13e10 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
13e20 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  l sqlite3BtreeGe
13e30 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
13e40 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
13e50 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
13e60 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
13e70 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
13e80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
13e90 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
13ea0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
13eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13ec0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
13ed0 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
13ee0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
13ef0 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
13f00 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
13f10 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
13f20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
13f30 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
13f40 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
13f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
13f60 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
13f70 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72   );.    pBt->nTr
13f80 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
13f90 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
13fa0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
13fb0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
13fc0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
13fd0 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
13fe0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
13ff0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74 2d  ANS_NONE;.  pBt-
14000 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75  >inStmt = 0;.  u
14010 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
14020 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
14030 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
14040 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14050 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
14060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
14070 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
14080 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  ubtransaction.  
14090 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
140a0 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65  on can.** can be
140b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64   rolled back ind
140c0 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
140d0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
140e0 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20  on..** You must 
140f0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
14100 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74  ion before start
14110 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
14120 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62  tion..** The sub
14130 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
14140 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
14150 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ly if the main t
14160 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f  ransaction.** co
14170 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
14180 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ack..**.** Only 
14190 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  one subtransacti
141a0 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
141b0 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20   at a time.  It 
141c0 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74  is an error to t
141d0 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61  ry.** to start a
141e0 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74   new subtransact
141f0 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73  ion if another s
14200 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
14210 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
14220 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
14230 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
14240 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
14250 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
14260 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
14270 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
14280 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
14290 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
142a0 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
142b0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
142c0 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
142d0 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
142e0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
142f0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
14300 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
14310 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
14320 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
14330 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
14340 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14350 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
14360 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
14370 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
14380 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
14390 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
143a0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
143b0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70   p->db;.  if( (p
143c0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
143d0 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
143e0 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72 63  inStmt ){.    rc
143f0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
14400 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
14410 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
14420 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
14430 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
14440 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
14450 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 72  S_WRITE );.    r
14460 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
14470 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  y ? SQLITE_OK : 
14480 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
14490 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
144a0 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53  r);.    pBt->inS
144b0 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  tmt = 1;.  }.  s
144c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
144d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
144e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ;.}.../*.** Comm
144f0 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20  it the statment 
14500 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
14510 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
14520 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20  ress.  If no.** 
14530 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
14540 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20 69  s active, this i
14550 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
14560 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
14570 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a  mmitStmt(Btree *
14580 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
14590 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
145a0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
145b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
145c0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
145d0 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  b;.  if( pBt->in
145e0 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65  Stmt && !pBt->re
145f0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63  adOnly ){.    rc
14600 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14610 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e 70  tmtCommit(pBt->p
14620 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
14630 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14640 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  _OK;.  }.  pBt->
14650 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73 71  inStmt = 0;.  sq
14660 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14670 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
14680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
14690 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73 74  ck the active st
146a0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
146b0 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73  action.  If no s
146c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  ubtransaction.**
146d0 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73 20   is active this 
146e0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
146f0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75  op..**.** All cu
14700 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
14710 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
14720 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
14730 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  y attempt.** to 
14740 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68 61  use a cursor tha
14750 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
14760 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
14770 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  his operation.**
14780 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
14790 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  an error..*/.int
147a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
147b0 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20  lbackStmt(Btree 
147c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
147d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
147e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
147f0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
14800 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
14810 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
14820 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d    if( pBt->inStm
14830 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f  t && !pBt->readO
14840 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nly ){.    rc = 
14850 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
14860 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
14870 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
14880 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
14890 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
148a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
148b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
148c0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
148d0 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
148e0 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
148f0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
14900 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
14910 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
14920 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
14930 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
14940 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
14950 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
14960 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
14970 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
14980 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
14990 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
149a0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
149b0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
149c0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
149d0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
149e0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
149f0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
14a00 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
14a10 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
14a20 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
14a30 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
14a40 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
14a50 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
14a60 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
14a70 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
14a80 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
14a90 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
14aa0 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
14ab0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
14ac0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
14ad0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
14ae0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
14af0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
14b00 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
14b10 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
14b20 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
14b30 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
14b40 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
14b50 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
14b60 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
14b70 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
14b80 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
14b90 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
14ba0 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
14bb0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
14bc0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
14bd0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
14be0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
14bf0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
14c00 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
14c10 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
14c20 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
14c30 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
14c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
14c50 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
14c60 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
14c70 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
14c80 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
14c90 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
14ca0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
14cb0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
14cc0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
14cd0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
14ce0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
14cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14d00 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
14d10 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
14d40 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
14d50 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d70 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
14d80 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
14d90 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
14dc0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
14dd0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
14de0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
14df0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
14e00 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
14e10 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
14e20 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
14e30 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
14e60 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
14e70 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
14e80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14e90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14ea0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
14eb0 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
14ec0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66  wrFlag ){.    if
14ed0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
14ee0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14ef0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
14f00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
14f10 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
14f20 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 20 29   iTable, 0, 0) )
14f30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14f40 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
14f50 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
14f60 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b  Bt->pPage1==0 ){
14f70 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74  .    rc = lockBt
14f80 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b  reeWithRetry(p);
14f90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14fa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14fb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
14fc0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65  .    if( pBt->re
14fd0 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67  adOnly && wrFlag
14fe0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14ff0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15000 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
15010 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
15020 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69  Pgno)iTable;.  i
15030 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
15040 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
15050 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29  Bt->pPager)==0 )
15060 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15070 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74  E_EMPTY;.    got
15080 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  o create_cursor_
15090 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  exception;.  }. 
150a0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
150b0 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
150c0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
150d0 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  >pPage, 0);.  if
150e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
150f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  ){.    goto crea
15100 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
15110 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ion;.  }..  /* N
15120 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
15130 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
15140 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
15150 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
15160 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
15170 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  , link the curso
15180 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
15190 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74  red list and set
151a0 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a   *ppCur (the.  *
151b0 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  * output argumen
151c0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
151d0 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  on)..  */.  pCur
151e0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
151f0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
15200 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
15210 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
15220 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77  pCur->wrFlag = w
15230 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70  rFlag;.  pCur->p
15240 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
15250 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  sor;.  if( pCur-
15260 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
15270 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
15280 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70   = pCur;.  }.  p
15290 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
152a0 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
152b0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
152c0 4c 49 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  LID;..  return S
152d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74  QLITE_OK;..creat
152e0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
152f0 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  on:.  releasePag
15300 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
15310 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
15320 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65  nused(pBt);.  re
15330 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
15340 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
15350 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
15390 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
153c0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
153d0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
153e0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15410 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
15420 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
15430 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
15440 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
15450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
15460 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
15470 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
15480 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
154b0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
154c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
154d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
154e0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
154f0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
15500 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
15510 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
15520 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
15530 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
15540 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15550 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
15560 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
15570 72 53 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72  rSize(){.  retur
15580 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  n sizeof(BtCurso
15590 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  r);.}..../*.** C
155a0 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
155b0 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
155c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
155d0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
155e0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
155f0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
15600 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15610 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
15620 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
15630 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
15640 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
15650 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
15660 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
15670 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
15680 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15690 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
156a0 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42      pBt->db = pB
156b0 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 63 6c  tree->db;.    cl
156c0 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
156d0 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
156e0 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a   pCur->pPrev ){.
156f0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65        pCur->pPre
15700 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
15710 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
15720 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  e{.      pBt->pC
15730 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
15740 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
15750 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
15760 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e  {.      pCur->pN
15770 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
15780 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a  r->pPrev;.    }.
15790 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
157a0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
157b0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
157c0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
157d0 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
157e0 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
157f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
15800 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
15810 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15820 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
15830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15840 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
15850 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
15860 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20  rsor by filling 
15870 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66  in the fields of
15880 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68   pTempCur..** Th
15890 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  e temporary curs
158a0 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  or is not on the
158b0 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72   cursor list for
158c0 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76   the Btree..*/.v
158d0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
158e0 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74  GetTempCursor(Bt
158f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74  Cursor *pCur, Bt
15900 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72  Cursor *pTempCur
15910 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
15920 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
15930 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ur) );.  memcpy(
15940 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20  pTempCur, pCur, 
15950 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
15960 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78    pTempCur->pNex
15970 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75  t = 0;.  pTempCu
15980 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
15990 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  if( pTempCur->pP
159a0 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
159b0 65 33 50 61 67 65 72 52 65 66 28 70 54 65 6d 70  e3PagerRef(pTemp
159c0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50  Cur->pPage->pDbP
159d0 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
159e0 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70  ** Delete a temp
159f0 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75 63  orary cursor suc
15a00 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62 79  h as was made by
15a10 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f   the CreateTempo
15a20 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20  raryCursor().** 
15a30 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a  function above..
15a40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
15a50 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
15a60 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
15a70 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
15a80 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15a90 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
15aa0 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a   pCur->pPage ){.
15ab0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
15ac0 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67  Unref(pCur->pPag
15ad0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
15ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
15af0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
15b00 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
15b10 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
15b20 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
15b30 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
15b40 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
15b50 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
15b60 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  l.** sqlite3Btre
15b70 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
15b80 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
15b90 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
15ba0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
15bb0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
15bc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
15bd0 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
15be0 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
15bf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
15c00 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
15c10 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
15c20 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
15c30 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
15c40 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
15c50 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
15c60 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
15c70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
15c80 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
15c90 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
15ca0 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
15cb0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
15cc0 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
15cd0 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
15ce0 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
15cf0 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
15d00 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
15d10 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
15d20 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
15d30 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
15d40 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
15d50 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
15d60 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
15d70 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
15d80 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
15d90 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
15da0 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
15db0 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
15dc0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
15dd0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
15de0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
15df0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
15e00 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
15e10 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
15e20 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
15e30 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  fo));.    sqlite
15e40 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
15e50 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
15e60 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a  r->idx, &info);.
15e70 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
15e80 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
15e90 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
15ea0 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
15eb0 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
15ec0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
15ed0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
15ee0 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
15ef0 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
15f00 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
15f10 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
15f20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
15f30 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
15f40 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
15f50 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
15f60 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
15f70 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
15f80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
15f90 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
15fa0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
15fb0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
15fc0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
15fd0 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
15fe0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
15ff0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
16000 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
16010 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
16020 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
16030 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
16040 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
16050 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
16060 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
16070 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
16080 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
160c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
160d0 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33     \.    sqlite3
16110 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
16120 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
16130 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e  ->idx, &pCur->in
16140 66 6f 29 3b 20 20 20 20 20 20 20 20 20 5c 0a 20  fo);         \. 
16150 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
16160 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ey = 1;         
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
161a0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
161f0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
16230 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
16240 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  VER */../*.** Se
16250 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
16260 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
16270 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
16280 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
16290 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
162a0 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
162b0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
162c0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
162d0 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
162e0 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
162f0 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
16300 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
16310 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
16320 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
16330 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
16340 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
16350 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
16360 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
16370 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16380 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
16390 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
163a0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20   *pSize){.  int 
163b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
163c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
163d0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
163e0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
163f0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
16400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16410 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16420 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
16430 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
16440 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
16450 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
16460 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
16470 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
16480 49 44 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69  ID ){.      *pSi
16490 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ze = 0;.    }els
164a0 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c  e{.      getCell
164b0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
164c0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
164d0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
164e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
164f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
16500 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
16510 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16520 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
16530 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
16540 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
16550 73 20 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65  s to.  Always re
16560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
16570 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
16580 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20  t possible.  If 
16590 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
165a0 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
165b0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e  ointing to an en
165c0 74 72 79 20 28 77 68 69 63 68 20 63 61 6e 20 68  try (which can h
165d0 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
165e0 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61  le, if.** the da
165f0 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 29  tabase is empty)
16600 20 74 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20   then *pSize is 
16610 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74  set to 0..*/.int
16620 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
16630 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
16640 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
16650 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
16660 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
16670 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
16680 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
16690 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
166a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
166b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
166c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
166d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
166e0 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
166f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
16700 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
16710 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
16720 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
16730 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
16740 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
16750 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
16760 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
16770 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
16780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
16790 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
167a0 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
167b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
167c0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
167d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
167e0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
167f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
16800 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
16810 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
16820 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
16830 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
16840 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
16850 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
16860 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
16870 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
16880 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
16890 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
168a0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
168b0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
168c0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
168d0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
168e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
168f0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
16900 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16910 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
16920 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
16930 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
16940 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rwise:.**.** Unl
16950 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73  ess pPgnoNext is
16960 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20   NULL, the page 
16970 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
16980 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  xt overflow .** 
16990 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
169a0 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74  ed list is writt
169b0 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
169c0 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a  . If page ovfl.*
169d0 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  * is the last pa
169e0 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
169f0 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
16a00 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
16a10 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
16a20 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
16a30 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
16a40 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68  o the MemPage* h
16a50 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67  andle.** for pag
16a60 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65  e ovfl. The unde
16a70 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61 67  rlying pager pag
16a80 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
16a90 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74  requested.** wit
16aa0 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  h the noContent 
16ab0 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65  flag set, so the
16ac0 20 70 61 67 65 20 64 61 74 61 20 61 63 63 65 73   page data acces
16ad0 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69  sable via.** thi
16ae0 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74  s handle may not
16af0 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a   be trusted..*/.
16b00 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
16b10 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
16b20 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
16b30 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b50 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
16b60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
16b70 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
16b80 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
16b90 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
16ba0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
16bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16bc0 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
16bd0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
16be0 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
16bf0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
16c00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16c10 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
16c20 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e  utex) );.  /* On
16c30 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20  e of these must 
16c40 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68  not be NULL. Oth
16c50 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c  erwise, why call
16c60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20   this function? 
16c70 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61  */.  assert(ppPa
16c80 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29  ge || pPgnoNext)
16c90 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f  ;..  /* If pPgno
16ca0 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
16cb0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
16cc0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
16cd0 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20   to obtain.  ** 
16ce0 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72  a MemPage* refer
16cf0 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61  ence only. No pa
16d00 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69  ge-data is requi
16d10 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  red in this case
16d20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
16d30 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72  gnoNext ){.    r
16d40 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
16d50 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
16d60 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  vfl, ppPage, 1);
16d70 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16d80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16d90 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
16da0 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
16db0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
16dc0 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
16dd0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
16de0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
16df0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
16e00 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16e10 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
16e20 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
16e30 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
16e40 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
16e50 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
16e60 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
16e70 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
16e80 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
16e90 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
16ea0 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
16eb0 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
16ec0 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
16ed0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
16ee0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
16ef0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
16f00 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
16f10 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
16f20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
16f30 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
16f40 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
16f50 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
16f60 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
16f70 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
16f80 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
16f90 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
16fa0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
16fb0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
16fc0 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
16fd0 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
16fe0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16ff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17000 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17020 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17030 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
17040 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
17050 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
17060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17070 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
17080 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50  ( next==0 || ppP
17090 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  age ){.    MemPa
170a0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
170b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
170c0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
170d0 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
170e0 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73  next!=0);.    as
170f0 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
17100 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b  OK || pPage==0);
17110 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  .    if( next==0
17120 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
17130 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
17140 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
17150 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
17160 0a 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20  .    if( ppPage 
17170 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
17180 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65   = pPage;.    }e
17190 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  lse{.      relea
171a0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
171b0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e     }.  }.  *pPgn
171c0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20  oNext = next;.. 
171d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
171e0 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
171f0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
17200 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
17210 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
17220 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
17230 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
17240 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
17250 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
17260 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
17270 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
17280 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
17290 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
172a0 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
172b0 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
172c0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
172d0 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
172e0 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
172f0 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
17300 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
17310 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
17320 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
17330 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
17340 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
17350 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
17360 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
17370 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17380 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
17390 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
173a0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
173b0 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
173c0 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
173d0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
173e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
173f0 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
17400 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
17410 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
17420 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
17430 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
17440 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17450 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
17460 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
17470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17480 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
17490 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
174a0 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
174b0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
174c0 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
174d0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
174e0 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
174f0 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
17500 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
17510 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
17520 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
17530 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
17540 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17550 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
17560 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
17580 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17590 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
175a0 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
175b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
175c0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
175d0 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
175e0 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
175f0 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
17600 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
17610 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
17620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17640 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
17650 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
17660 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
17670 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
17680 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
17690 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
176a0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
176b0 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
176c0 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
176d0 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
176e0 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
176f0 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
17700 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
17710 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
17720 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
17730 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
17740 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
17750 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
17760 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
17770 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
17780 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
17790 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
177a0 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
177b0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
177c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
177d0 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64  oes not make a d
177e0 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65  istinction betwe
177f0 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e  en key and data.
17800 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64  .** It just read
17810 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65  s or writes byte
17820 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f  s from the paylo
17830 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d  ad area.  Data m
17840 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20  ight .** appear 
17850 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
17860 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
17870 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
17880 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
17890 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
178a0 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
178b0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
178c0 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
178d0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
178e0 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
178f0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
17900 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
17910 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
17920 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
17930 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
17940 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
17950 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
17960 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
17970 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
17980 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
17990 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
179a0 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
179b0 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
179c0 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
179d0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
179e0 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
179f0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
17a00 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
17a10 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
17a20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
17a30 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
17a40 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
17a50 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
17a60 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
17a70 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
17a80 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
17a90 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
17aa0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
17ab0 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
17ac0 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
17ad0 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
17ae0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
17af0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
17b00 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
17b10 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
17b20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
17b30 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
17b40 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
17b50 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
17b60 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
17b70 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
17b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17b90 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
17ba0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
17bb0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
17bc0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
17bd0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
17be0 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20  /.  int offset, 
17bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
17c00 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
17c10 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
17c20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
17c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
17c40 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
17c50 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
17c60 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
17c70 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
17c80 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
17c90 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65  */ .  int skipKe
17ca0 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  y,         /* of
17cb0 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64  fset begins at d
17cc0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
17cd0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  rue */.  int eOp
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17cf0 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
17d00 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
17d10 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
17d20 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
17d30 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
17d40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
17d50 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
17d60 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
17d70 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
17d80 61 67 65 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  age;     /* Btre
17d90 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e  e page of curren
17da0 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 2a  t cursor entry *
17db0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
17dc0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
17dd0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
17de0 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
17df0 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
17e00 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
17e10 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
17e20 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
17e30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
17e40 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
17e50 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
17e60 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
17e70 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
17e80 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
17e90 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
17ea0 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
17eb0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
17ec0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
17ed0 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
17ee0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
17ef0 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
17f00 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72 2d  tKey ? 0 : pCur-
17f10 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
17f20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
17f30 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65     offset += nKe
17f40 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66  y;.  }.  if( off
17f50 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
17f60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20  Cur->info.nData 
17f70 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
17f80 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
17f90 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
17fa0 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
17fb0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
17fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17fd0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  R;.  }..  /* Che
17fe0 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
17ff0 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
18000 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
18010 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
18020 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
18030 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18040 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
18050 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
18060 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
18070 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
18080 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
18090 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
180a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
180b0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
180c0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
180d0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61  Buf, a, eOp, pPa
180e0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
180f0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
18100 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
18110 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
18120 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
18130 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
18140 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 70 42 74 20  cal;.  }..  pBt 
18150 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69  = pCur->pBt;.  i
18160 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18170 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
18180 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53   const int ovflS
18190 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
181a0 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
181b0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
181c0 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
181d0 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
181e0 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
181f0 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
18200 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
18210 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
18220 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
18230 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
18240 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
18250 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
18260 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
18270 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
18280 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
18290 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
182a0 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
182b0 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
182c0 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
182d0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
182e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
182f0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
18300 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
18310 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
18320 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
18330 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
18340 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
18350 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
18360 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
18370 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
18380 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
18390 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
183a0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
183b0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
183c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
183d0 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
183e0 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
183f0 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
18400 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
18410 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
18420 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
18430 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
18440 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
18450 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
18460 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
18470 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
18480 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
18490 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  l);.      if( nO
184a0 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  vfl && !pCur->aO
184b0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
184c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
184d0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
184e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
184f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
18500 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
18510 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
18520 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
18530 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
18540 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
18550 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
18560 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
18570 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
18580 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
18590 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
185a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
185b0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
185c0 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
185d0 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
185e0 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
185f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
18600 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
18610 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
18620 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
18630 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
18640 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
18650 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
18660 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
18670 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
18680 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
18690 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
186a0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
186b0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
186c0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
186d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
186e0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
186f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
18700 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
18710 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
18720 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
18730 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
18740 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
18750 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
18760 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
18770 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
18780 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
18790 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
187a0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
187b0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
187c0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
187d0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
187e0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
187f0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
18800 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
18810 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
18820 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
18830 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
18840 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
18850 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
18860 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
18870 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
18880 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
18890 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
188a0 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
188b0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
188c0 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
188d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
188e0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
188f0 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
18900 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
18910 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
18920 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
18930 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
18940 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
18950 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
18960 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
18970 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
18980 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
18990 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
189a0 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
189b0 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
189c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
189d0 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
189e0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
189f0 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
18a00 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
18a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
18a20 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
18a30 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
18a40 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
18a50 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
18a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
18a70 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
18a80 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
18a90 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
18aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
18ab0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
18ac0 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
18ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18af0 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
18b00 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
18b10 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
18b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
18b30 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
18b40 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
18b50 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
18b60 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
18b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
18b80 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
18b90 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
18ba0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
18bb0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
18bc0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
18bd0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
18be0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18bf0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18c00 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
18c10 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
18c20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
18c30 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
18c40 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
18c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
18c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18c80 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
18c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18ca0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
18cb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18cc0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
18cd0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
18ce0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
18cf0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
18d00 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
18d10 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
18d20 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
18d30 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
18d40 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
18d50 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
18d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
18d70 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
18d80 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
18d90 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18da0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
18db0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
18dc0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
18dd0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
18de0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
18df0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18e00 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
18e10 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
18e20 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
18e30 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
18e40 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
18e50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
18e60 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
18e70 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
18e80 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
18e90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18ea0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
18eb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
18ec0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
18ed0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18ee0 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20  >pPage!=0 );.   
18ef0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65   if( pCur->pPage
18f00 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
18f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18f20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18f30 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18f40 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
18f50 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Key==0 );.    as
18f60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
18f70 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
18f80 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
18f90 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
18fa0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
18fb0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
18fc0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
18fd0 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  pBuf, 0, 0);.  }
18fe0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18ff0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
19000 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
19010 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
19020 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
19030 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
19040 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
19050 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
19060 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
19070 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
19080 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
19090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
190a0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
190b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
190c0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
190d0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
190e0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
190f0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
19100 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
19110 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
19120 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
19130 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
19140 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
19150 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
19160 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
19170 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
19180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
19190 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
191a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
191b0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
191c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
191d0 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
191e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
191f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19200 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
19210 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
19220 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
19230 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19240 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
19250 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
19260 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
19270 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
19280 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ge!=0 );.    ass
19290 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
192a0 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
192b0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
192c0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
192d0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
192e0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
192f0 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  Buf, 1, 0);.  }.
19300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19310 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
19320 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
19330 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
19340 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
19350 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
19360 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
19370 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
19380 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
19390 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
193a0 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
193b0 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
193c0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
193d0 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
193e0 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
193f0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19400 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
19410 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
19420 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
19430 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
19440 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
19450 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
19460 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
19470 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
19480 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
19490 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
194a0 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
194b0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
194c0 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
194d0 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
194e0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
194f0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
19500 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
19510 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
19520 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
19530 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
19540 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
19550 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
19560 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
19570 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
19580 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
19590 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
195a0 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
195b0 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
195c0 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
195d0 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mbly.** the key/
195e0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
195f0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
19600 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
19610 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
19620 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
19630 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
19640 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
19650 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
19660 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
19670 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
19680 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
19690 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
196a0 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
196b0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
196c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
196d0 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
196e0 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
196f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
19700 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
19710 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
19720 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
19730 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
19740 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
19750 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
19760 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
19770 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
19780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
19790 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
197a0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
197b0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
197c0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
197d0 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
197e0 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
197f0 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b  y;.  int nLocal;
19800 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
19810 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  !=0 && pCur->pPa
19820 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
19830 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
19840 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
19850 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19860 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19870 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ) );.  pPage = p
19880 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
19890 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
198a0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
198b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
198c0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
198d0 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
198e0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
198f0 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
19900 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
19910 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
19920 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
19930 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
19940 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70  se{.    nKey = p
19950 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
19960 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65    }.  if( skipKe
19970 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61  y ){.    aPayloa
19980 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e  d += nKey;.    n
19990 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
199a0 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79  fo.nLocal - nKey
199b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
199c0 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e  Local = pCur->in
199d0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69  fo.nLocal;.    i
199e0 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29  f( nLocal>nKey )
199f0 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  {.      nLocal =
19a00 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d   nKey;.    }.  }
19a10 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
19a20 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
19a30 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
19a40 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
19a50 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
19a60 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
19a70 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
19a80 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
19a90 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
19aa0 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
19ab0 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
19ac0 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
19ad0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
19ae0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
19af0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
19b00 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
19b10 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
19b20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
19b30 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
19b40 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
19b50 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
19b60 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
19b70 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
19b80 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
19b90 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
19ba0 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
19bb0 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
19bc0 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
19bd0 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
19be0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
19bf0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
19c00 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
19c10 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
19c20 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
19c30 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
19c40 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
19c50 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
19c60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
19c70 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
19c80 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
19c90 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
19ca0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
19cb0 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
19cc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19cd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19ce0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
19cf0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19d00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
19d10 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
19d20 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
19d30 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
19d40 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
19d50 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
19d60 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
19d70 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
19d80 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28  pAmt){.  assert(
19d90 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19da0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
19db0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19dc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
19dd0 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
19de0 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
19df0 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
19e00 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
19e10 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   0;.}.../*.** Mo
19e20 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
19e30 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
19e40 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
19e50 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
19e60 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
19e70 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
19e80 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
19e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19ea0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
19eb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
19ec0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
19ed0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
19ee0 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  NewPage;.  MemPa
19ef0 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20 20  ge *pOldPage;.  
19f00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19f10 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
19f20 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19f30 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19f40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
19f50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
19f60 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 67  ALID );.  rc = g
19f70 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
19f80 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
19f90 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50 61  wPage, pCur->pPa
19fa0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
19fb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65  return rc;.  pNe
19fc0 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  wPage->idxParent
19fd0 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20   = pCur->idx;.  
19fe0 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d  pOldPage = pCur-
19ff0 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61  >pPage;.  pOldPa
1a000 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30  ge->idxShift = 0
1a010 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1a020 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75  pOldPage);.  pCu
1a030 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50  r->pPage = pNewP
1a040 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78  age;.  pCur->idx
1a050 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
1a060 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1a070 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1a080 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
1a090 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a  age->nCell<1 ){.
1a0a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a0b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1a0c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1a0d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1a0e0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1a0f0 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
1a100 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
1a110 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  its table..**.**
1a120 20 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   The virtual roo
1a130 74 20 70 61 67 65 20 69 73 20 74 68 65 20 72 6f  t page is the ro
1a140 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74  ot page for most
1a150 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a   tables.  But.**
1a160 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72   for the table r
1a170 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c  ooted on page 1,
1a180 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65   sometime the re
1a190 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  al root page.** 
1a1a0 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20  is empty except 
1a1b0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
1a1c0 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20  inter.  In such 
1a1d0 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72  cases the.** vir
1a1e0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
1a1f0 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
1a200 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65  the right-pointe
1a210 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69  r of page.** 1 i
1a220 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  s pointing to..*
1a230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a240 65 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d  eeIsRootPage(Mem
1a250 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1a260 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
1a270 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1a280 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a290 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1a2a0 78 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20  x) );.  pParent 
1a2b0 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
1a2c0 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d  ;.  if( pParent=
1a2d0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1a2e0 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67   if( pParent->pg
1a2f0 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  no>1 ) return 0;
1a300 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28  .  if( get2byte(
1a310 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
1a320 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
1a330 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75  et+3])==0 ) retu
1a340 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
1a350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1a360 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
1a370 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
1a380 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
1a390 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1a3a0 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
1a3b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
1a3c0 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
1a3d0 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
1a3e0 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
1a3f0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
1a400 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
1a410 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
1a420 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
1a430 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
1a440 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
1a450 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
1a460 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1a470 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
1a480 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1a490 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
1a4a0 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  nt;.  MemPage *p
1a4b0 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50  Page;.  int idxP
1a4c0 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
1a4d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1a4e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1a4f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1a500 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a510 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
1a520 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
1a530 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b  ert( pPage!=0 );
1a540 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
1a550 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61  te3BtreeIsRootPa
1a560 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70  ge(pPage) );.  p
1a570 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
1a580 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
1a590 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b  t( pParent!=0 );
1a5a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a5b0 2d 3e 70 44 62 50 61 67 65 2d 3e 6e 52 65 66 3e  ->pDbPage->nRef>
1a5c0 30 20 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74  0 );.  idxParent
1a5d0 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72   = pPage->idxPar
1a5e0 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ent;.  sqlite3Pa
1a5f0 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
1a600 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  pDbPage);.  rele
1a610 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
1a620 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1a630 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d  pParent;.  pCur-
1a640 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1a650 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1a660 65 79 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ey = 0;.  assert
1a670 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68  ( pParent->idxSh
1a680 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  ift==0 );.  pCur
1a690 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65 6e  ->idx = idxParen
1a6a0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  t;.}../*.** Move
1a6b0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1a6c0 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a  he root page.*/.
1a6d0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a6e0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
1a6f0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
1a700 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
1a710 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a720 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
1a730 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
1a740 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a750 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
1a760 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1a770 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1a780 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
1a790 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
1a7a0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
1a7b0 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
1a7c0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
1a7d0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
1a7e0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
1a7f0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
1a800 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
1a810 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
1a820 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1a830 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
1a840 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a850 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
1a860 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
1a870 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  kip;.    }.    c
1a880 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1a890 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  on(pCur);.  }.  
1a8a0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50  pRoot = pCur->pP
1a8b0 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  age;.  if( pRoot
1a8c0 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d   && pRoot->pgno=
1a8d0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1a8e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a8f0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Root->isInit );.
1a900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1a910 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
1a920 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49  K!=(rc = getAndI
1a930 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
1a940 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  r->pgnoRoot, &pR
1a950 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a  oot, 0)).    ){.
1a960 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1a970 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1a980 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
1a990 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1a9a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1a9b0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  ->pPage);.    pC
1a9c0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f  ur->pPage = pRoo
1a9d0 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  t;.  }.  pCur->i
1a9e0 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
1a9f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1aa00 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
1aa10 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1aa20 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
1aa30 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
1aa40 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
1aa50 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
1aa60 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74  page;.    assert
1aa70 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pRoot->pgno==1
1aa80 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20   );.    subpage 
1aa90 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
1aaa0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
1aab0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1aac0 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70 61     assert( subpa
1aad0 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72  ge>0 );.    pCur
1aae0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1aaf0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
1ab00 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1ab10 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
1ab20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
1ab30 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65   = ((pCur->pPage
1ab40 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
1ab50 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
1ab60 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72  NVALID);.  retur
1ab70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1ab80 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1ab90 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
1aba0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
1abb0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
1abc0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
1abd0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1abe0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
1abf0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1ac00 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1ac10 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
1ac20 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
1ac30 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1ac40 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1ac50 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
1ac60 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1ac70 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1ac80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ac90 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
1aca0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
1acb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1acc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1acd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1ace0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1acf0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
1ad00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1ad10 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  (pPage = pCur->p
1ad20 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  Page)->leaf ){. 
1ad30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ad40 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1ad50 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1ad60 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
1ad70 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1ad80 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1ad90 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  dx));.    rc = m
1ada0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1adb0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
1adc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1add0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1ade0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
1adf0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
1ae00 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1ae10 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
1ae20 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1ae30 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
1ae40 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
1ae50 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
1ae60 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
1ae70 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
1ae80 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
1ae90 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1aea0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
1aeb0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1aec0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
1aed0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1aee0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
1aef0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
1af00 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
1af10 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
1af20 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
1af30 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1af40 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
1af50 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
1af60 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1af70 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1af80 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
1af90 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1afa0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
1afb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1afc0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
1afd0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
1afe0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1aff0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b000 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b010 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b020 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
1b030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b040 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1b050 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
1b060 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1b070 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1b080 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1b090 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
1b0a0 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1b0b0 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1b0c0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1b0d0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
1b0e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b0f0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78  ){.    pCur->idx
1b100 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   = pPage->nCell 
1b110 2d 20 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  - 1;.    pCur->i
1b120 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1b130 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1b140 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1b150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b160 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1b170 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
1b180 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1b190 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1b1a0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1b1b0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1b1c0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1b1d0 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1b1e0 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1b1f0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1b200 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1b210 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1b220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b230 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
1b240 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1b250 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
1b260 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b270 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1b290 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b2a0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1b2b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1b2c0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1b2d0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1b2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b2f0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1b300 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1b310 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b320 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1b330 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1b340 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1b350 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b360 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b370 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b380 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
1b390 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1b3a0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1b3b0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1b3c0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
1b3d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b3e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1b3f0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
1b400 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1b410 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1b420 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1b430 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1b440 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1b450 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1b460 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1b470 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1b480 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1b490 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1b4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1b4b0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1b4c0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1b4d0 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
1b4e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1b4f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b500 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b510 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1b520 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1b530 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1b540 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1b550 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b560 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
1b570 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1b580 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1b590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1b5a0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1b5b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
1b5c0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1b5d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b5e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b5f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1b600 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1b610 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1b620 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1b630 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1b640 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1b650 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
1b660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  c==SQLITE_OK;.  
1b670 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b680 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
1b690 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
1b6a0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1b6b0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
1b6c0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
1b6d0 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
1b6e0 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
1b6f0 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
1b700 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
1b710 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
1b720 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
1b730 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
1b740 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
1b750 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
1b760 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
1b770 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
1b780 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
1b790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
1b7a0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
1b7b0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
1b7c0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
1b7d0 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
1b7e0 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
1b7f0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
1b800 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
1b810 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
1b820 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
1b830 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
1b840 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
1b850 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
1b860 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
1b870 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  *.** The result 
1b880 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  of comparing the
1b890 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
1b8a0 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
1b8b0 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77 72  .** cursor is wr
1b8c0 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20 69  itten to *pRes i
1b8d0 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54  f pRes!=NULL.  T
1b8e0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a  he meaning of.**
1b8f0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 61   this value is a
1b900 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
1b910 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
1b920 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b930 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b940 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b950 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b960 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
1b970 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74 68  an pKey or if th
1b980 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1b990 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b9a0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
1b9b0 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
1b9c0 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
1b9d0 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
1b9e0 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
1b9f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1ba00 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1ba10 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
1ba40 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  pKey..**.**     
1ba50 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
1ba60 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1ba70 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1ba80 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1baa0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b 65   larger than pKe
1bab0 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
1bac0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
1bad0 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
1bae0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1baf0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1bb00 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
1bb10 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1bb20 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
1bb30 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1bb40 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
1bb50 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1bb60 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
1bb70 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
1bb80 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
1bb90 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
1bba0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
1bbb0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1bbc0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1bbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1bbe0 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
1bbf0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1bc00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1bc10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1bc20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1bc30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1bc40 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1bc50 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1bc60 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1bc70 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
1bc80 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
1bc90 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
1bca0 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
1bcb0 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
1bcc0 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
1bcd0 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
1bce0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
1bcf0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1bd00 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76  VALID && pCur->v
1bd10 61 6c 69 64 4e 4b 65 79 20 26 26 20 70 43 75 72  alidNKey && pCur
1bd20 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
1bd30 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1bd40 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
1bd50 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1bd60 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1bd70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bd80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1bd90 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1bda0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
1bdb0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1bdc0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
1bdd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bde0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72  .    }.  }...  r
1bdf0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1be00 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
1be10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1be20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1be30 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20  Cur->pPage );.  
1be40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1be50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1be60 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1be70 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1be80 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
1be90 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
1bea0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1beb0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
1bec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bed0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1bee0 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
1bef0 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
1bf00 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1bf10 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
1bf20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
1bf30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1bf40 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1bf50 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
1bf60 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
1bf70 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
1bf80 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
1bf90 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
1bfa0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
1bfb0 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21  ell-1;.    if( !
1bfc0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1bfd0 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 7b 0a 20   pIdxKey==0 ){. 
1bfe0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bff0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c000 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1c010 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
1c020 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
1c030 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1c040 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d  idx = upr;.    }
1c050 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
1c060 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72  ->idx = (upr+lwr
1c070 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  )/2;.    }.    i
1c080 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f  f( lwr<=upr ) fo
1c090 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69  r(;;){.      voi
1c0a0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
1c0b0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
1c0c0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  .      pCur->inf
1c0d0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1c0e0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1c0f0 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  ey = 1;.      if
1c100 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1c110 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
1c120 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Cell;.        pC
1c130 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1c140 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
1c150 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
1c160 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
1c170 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
1c180 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
1c190 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  u32 dummy;.     
1c1a0 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65       pCell += ge
1c1b0 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
1c1c0 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20   dummy);.       
1c1d0 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
1c1e0 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
1c1f0 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
1c200 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
1c210 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
1c220 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
1c230 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c240 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
1c250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1c260 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1c270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
1c280 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e  ssert( nCellKey>
1c290 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
1c2a0 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20      c = +1;.    
1c2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1c2c0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e{.        int a
1c2d0 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20  vailable;.      
1c2e0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f    pCellKey = (vo
1c2f0 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  id *)fetchPayloa
1c300 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62  d(pCur, &availab
1c310 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  le, 0);.        
1c320 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d  nCellKey = pCur-
1c330 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
1c340 20 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c      if( availabl
1c350 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20  e>=nCellKey ){. 
1c360 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
1c370 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1c380 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20  mpare(nCellKey, 
1c390 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
1c3a0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
1c3b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  e{.          pCe
1c3c0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
1c3d0 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20  alloc( nCellKey 
1c3e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c3f0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
1c400 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1c410 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c420 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1c430 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c440 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c450 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c460 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
1c470 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f  0, nCellKey, (vo
1c480 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a  id *)pCellKey);.
1c490 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
1c4a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1c4b0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c  ompare(nCellKey,
1c4c0 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
1c4d0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
1c4e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
1c4f0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
1c500 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
1c510 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c530 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
1c540 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1c550 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
1c560 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  lKey;.        if
1c570 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1c580 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
1c590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
1c5a0 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20   = pCur->idx;.  
1c5b0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
1c5c0 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
1c5d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c5f0 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
1c600 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
1c610 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c620 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1c630 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c650 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29  .      if( c<0 )
1c660 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20  {.        lwr = 
1c670 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20  pCur->idx+1;.   
1c680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c690 20 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64    upr = pCur->id
1c6a0 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
1c6b0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
1c6c0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
1c6d0 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
1c6e0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72  lKey;.        br
1c6f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c700 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28     pCur->idx = (
1c710 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20  lwr+upr)/2;.    
1c720 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
1c730 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
1c740 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1c750 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
1c760 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1c770 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
1c780 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c790 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
1c7a0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
1c7b0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
1c7c0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c7d0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1c7e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c7f0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1c800 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1c810 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
1c820 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
1c830 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1c840 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
1c850 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
1c860 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
1c870 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   );.      if( pR
1c880 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a  es ) *pRes = c;.
1c890 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c8a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
1c8b0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
1c8c0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
1c8d0 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70  idx = lwr;.    p
1c8e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1c8f0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
1c900 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1c910 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1c920 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
1c930 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
1c940 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c950 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
1c960 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
1c970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  c;.}../*.** In t
1c980 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
1c990 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
1c9a0 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
1c9b0 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
1c9c0 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
1c9d0 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
1c9e0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
1c9f0 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
1ca00 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
1ca10 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
1ca20 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
1ca30 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20  he work..*/.int 
1ca40 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1ca50 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
1ca60 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
1ca70 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
1ca80 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
1ca90 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
1caa0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1cab0 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
1cac0 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
1cad0 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
1cae0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
1caf0 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
1cb00 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
1cb10 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
1cb20 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
1cb30 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1cb40 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
1cb50 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1cb60 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1cb70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
1cb80 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
1cb90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
1cbc0 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
1cbd0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
1cbe0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
1cbf0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  ndex key */.  Un
1cc00 70 61 63 6b 65 64 52 65 63 6f 72 64 20 61 53 70  packedRecord aSp
1cc10 61 63 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d 70  ace[16]; /* Temp
1cc20 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
1cc30 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
1cc40 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28  malloc */..  if(
1cc50 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 49 64   pKey ){.    pId
1cc60 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
1cc70 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
1cc80 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e  Cur->pKeyInfo, n
1cc90 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
1ccd0 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66  aSpace));.    if
1cce0 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
1ccf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1cd00 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
1cd10 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20   pIdxKey = 0;.  
1cd20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1cd30 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
1cd40 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65  ked(pCur, pIdxKe
1cd50 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70  y, nKey, bias, p
1cd60 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  Res);.  if( pKey
1cd70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1cd80 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
1cd90 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29  dRecord(pIdxKey)
1cda0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cdb0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
1cdc0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1cdd0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1cde0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
1cdf0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
1ce00 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
1ce10 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
1ce20 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
1ce30 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
1ce40 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
1ce50 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
1ce60 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
1ce70 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
1ce80 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
1ce90 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
1cea0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
1ceb0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
1cec0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1ced0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1cee0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
1cef0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
1cf00 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
1cf10 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
1cf20 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
1cf30 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
1cf40 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
1cf50 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
1cf60 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
1cf70 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
1cf80 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
1cf90 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
1cfa0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
1cfb0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
1cfc0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
1cfd0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
1cfe0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  te);.}../*.** Re
1cff0 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
1d000 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  e connection han
1d010 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72  dle for a cursor
1d020 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1d030 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1d040 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72 73 6f  Db(const BtCurso
1d050 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
1d060 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d070 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1d080 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1d090 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
1d0a0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a  ->pBtree->db;.}.
1d0b0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
1d0c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1d0d0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
1d0e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1d0f0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1d100 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1d110 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1d120 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1d130 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
1d140 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1d150 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
1d160 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1d170 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
1d180 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
1d190 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1d1a0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
1d1b0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
1d1c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
1d1d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1d1e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1d1f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1d200 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1d210 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1d220 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1d230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d240 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d250 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  }.  assert( pRes
1d260 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  !=0 );.  pPage =
1d270 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
1d280 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1d290 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1d2a0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1d2b0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1d2c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1d2d0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20  f( pCur->skip>0 
1d2e0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
1d2f0 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
1d300 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1d310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d320 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1d330 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1d340 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1d350 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1d360 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
1d370 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b  ;..  pCur->idx++
1d380 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1d390 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1d3a0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1d3b0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
1d3c0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1d3d0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
1d3e0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1d3f0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1d400 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
1d410 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1d420 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1d430 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
1d440 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1d450 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1d460 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1d470 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1d480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1d490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
1d4a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d4b0 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
1d4c0 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  (pPage) ){.     
1d4d0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1d4e0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1d4f0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1d500 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
1d510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1d530 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
1d540 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
1d550 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
1d560 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69  >pPage;.    }whi
1d570 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  le( pCur->idx>=p
1d580 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1d590 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1d5a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1d5b0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
1d5c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
1d5d0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
1d5e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d5f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d600 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1d610 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
1d620 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
1d630 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1d640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d650 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
1d660 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1d670 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d680 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
1d690 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1d6a0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
1d6b0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
1d6c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1d6d0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
1d6e0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
1d6f0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
1d700 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
1d710 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
1d720 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
1d730 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
1d740 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
1d750 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
1d760 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
1d770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d780 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
1d790 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1d7a0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1d7b0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  ;.  Pgno pgno;. 
1d7c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1d7d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1d7e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d7f0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1d800 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1d810 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1d820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d830 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d840 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61    }.  pCur->atLa
1d850 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55  st = 0;.  if( CU
1d860 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1d870 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1d880 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1d890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d8a0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
1d8b0 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20  r->skip<0 ){.   
1d8c0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1d8d0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1d8e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d8f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1d900 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70  ->skip = 0;..  p
1d910 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1d920 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
1d930 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
1d940 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1d950 64 78 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  dx>=0 );.  if( !
1d960 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1d970 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1d980 74 65 28 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  te( findCell(pPa
1d990 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20 29  ge, pCur->idx) )
1d9a0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1d9b0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1d9c0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
1d9d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1d9e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1d9f0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1da00 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
1da10 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
1da20 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20  r->idx==0 ){.   
1da30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
1da40 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
1da50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
1da60 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1da70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1da80 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1da90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1daa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1dab0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1dac0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1dad0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
1dae0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1daf0 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  age;.    }.    p
1db00 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20  Cur->idx--;.    
1db10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1db20 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
1db30 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1db40 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1db50 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
1db60 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1db70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1db80 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
1db90 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1dba0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dbb0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1dbc0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
1dbd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1dbe0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1dbf0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
1dc00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1dc10 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
1dc20 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
1dc30 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
1dc40 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
1dc50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
1dc60 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1dc70 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
1dc80 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
1dc90 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
1dca0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
1dcb0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
1dcc0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
1dcd0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1dce0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
1dcf0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
1dd00 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
1dd10 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
1dd20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1dd30 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1dd40 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
1dd50 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1dd60 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
1dd70 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
1dd80 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
1dd90 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
1dda0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
1ddb0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
1ddc0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
1ddd0 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
1dde0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1ddf0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1de00 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
1de10 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
1de20 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
1de30 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
1de40 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
1de50 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
1de60 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1de70 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
1de80 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
1de90 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
1dea0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
1deb0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
1dec0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
1ded0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
1dee0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
1def0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
1df00 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
1df10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
1df20 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
1df30 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
1df40 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
1df50 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
1df60 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
1df70 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
1df80 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
1df90 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
1dfa0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
1dfb0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
1dfc0 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
1dfd0 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
1dfe0 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
1dff0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1e000 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
1e010 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
1e020 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1e030 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
1e040 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
1e050 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
1e060 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1e070 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  1;.  int rc;.  i
1e080 6e 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  nt n;     /* Num
1e090 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1e0a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1e0b0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20    int k;     /* 
1e0c0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1e0d0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
1e0e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
1e0f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
1e100 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
1e110 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
1e120 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
1e130 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1e140 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1e150 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
1e160 70 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65  pPage1;.  n = ge
1e170 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1e180 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66  aData[36]);.  if
1e190 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
1e1a0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
1e1b0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
1e1c0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
1e1d0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
1e1e0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
1e1f0 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
1e200 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
1e210 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
1e220 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
1e230 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
1e240 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
1e250 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
1e260 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
1e270 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
1e280 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
1e290 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
1e2a0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
1e2b0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
1e2c0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
1e2d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
1e2e0 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
1e2f0 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
1e300 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
1e310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e320 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1e330 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
1e340 65 61 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65  earby<=pagerPage
1e350 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1e360 72 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  r) ){.      u8 e
1e370 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
1e380 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
1e390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1e3a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
1e3b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1e3c0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
1e3d0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
1e3e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1e3f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
1e400 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1e410 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1e420 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
1e430 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1e440 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
1e450 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
1e460 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
1e470 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
1e480 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
1e490 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
1e4a0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
1e4b0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
1e4c0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
1e4d0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
1e4e0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
1e4f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e500 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1e510 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1e520 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e530 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
1e540 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e550 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
1e560 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
1e570 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
1e580 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
1e590 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
1e5a0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
1e5b0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
1e5c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
1e5d0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1e5e0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
1e5f0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
1e600 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
1e610 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
1e620 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
1e630 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
1e640 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
1e650 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
1e660 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1e670 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
1e680 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1e690 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
1e6a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e6b0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1e6c0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1e6d0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
1e6e0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
1e6f0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1e700 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
1e710 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
1e720 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e730 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1e740 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1e750 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1e760 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
1e770 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
1e780 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
1e790 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
1e7a0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
1e7b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1e7c0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
1e7d0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
1e7e0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
1e7f0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
1e800 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
1e810 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
1e820 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
1e830 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
1e840 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
1e850 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
1e860 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
1e870 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
1e880 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e890 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1e8a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e8b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1e8c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1e8d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1e8e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e8f0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
1e900 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
1e910 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1e920 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1e930 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1e940 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1e950 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
1e960 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1e970 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1e980 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
1e990 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
1e9a0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
1e9b0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
1e9c0 65 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61  e if( k>pBt->usa
1e9d0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
1e9e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
1e9f0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
1ea00 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
1ea10 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
1ea20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ea30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ea40 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1ea50 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1ea60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1ea70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ea80 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ea90 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
1eaa0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
1eab0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1eac0 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
1ead0 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
1eae0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
1eaf0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1eb00 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
1eb10 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
1eb20 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
1eb30 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1eb40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
1eb50 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
1eb60 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1eb70 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1eb80 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1eb90 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
1eba0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ebb0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
1ebc0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1ebd0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1ebe0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ebf0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1ec00 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
1ec10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1ec20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1ec30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1ec40 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1ec50 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1ec60 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1ec70 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1ec80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1ec90 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
1eca0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
1ecb0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1ecc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1ecd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ece0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1ecf0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
1ed00 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
1ed10 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
1ed20 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
1ed30 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
1ed40 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
1ed50 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
1ed60 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
1ed70 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
1ed80 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
1ed90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1eda0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1edb0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
1edc0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
1edd0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
1ede0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
1edf0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1ee00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1ee10 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
1ee20 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
1ee30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
1ee40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ee50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ee60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1ee70 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1ee80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1ee90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1eea0 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
1eeb0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1eec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1eed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1eee0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1eef0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1ef00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1ef10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1ef20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ef30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1ef40 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1ef50 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
1ef60 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1ef70 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ef80 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
1ef90 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
1efa0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
1efb0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
1efc0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1efd0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
1efe0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1eff0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1f000 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1f010 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
1f020 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1f030 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1f040 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
1f050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1f060 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f070 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f080 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
1f090 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
1f0a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1f0b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f0c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1f0d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1f0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f0f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
1f100 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1f110 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1f120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
1f140 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1f150 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1f160 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1f170 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1f180 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1f190 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
1f1a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f1b0 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
1f1c0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
1f1d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1f1e0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
1f1f0 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
1f200 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
1f210 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
1f220 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
1f230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f240 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1f250 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f260 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1f270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1f280 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1f290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f2a0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
1f2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1f2c0 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  i, dist;.       
1f2d0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
1f2e0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1f2f0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1f300 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
1f310 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
1f320 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
1f330 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
1f340 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
1f350 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1f360 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
1f370 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
1f380 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1f390 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
1f3a0 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
1f3b0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
1f3c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1f3d0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
1f3f0 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
1f400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f410 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1f420 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
1f430 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
1f440 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
1f450 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
1f460 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
1f470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
1f480 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
1f490 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
1f4a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61           int nPa
1f4b0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  ge;.          *p
1f4c0 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
1f4d0 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20          nPage = 
1f4e0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1f4f0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1f500 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e         if( *pPgn
1f510 6f 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  o>nPage ){.     
1f520 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70         /* Free p
1f530 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20  age off the end 
1f540 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1f550 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f560 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f570 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
1f580 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1f590 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
1f5a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54     }.          T
1f5b0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1f5c0 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
1f5d0 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
1f5e0 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
1f5f0 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
1f600 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f620 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
1f630 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
1f640 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
1f650 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
1f660 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
1f670 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
1f680 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
1f690 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
1f6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f6b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1f6c0 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
1f6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f6e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1f6f0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1f700 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  , ppPage, 1);.  
1f710 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f730 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f740 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1f750 6b 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  k((*ppPage)->pDb
1f760 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1f770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f780 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
1f790 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
1f7a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1f7b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1f7d0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
1f7e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f7f0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1f800 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1f810 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1f820 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1f830 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
1f840 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
1f850 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
1f860 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
1f870 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
1f880 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
1f890 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
1f8a0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
1f8b0 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
1f8c0 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
1f8d0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1f8e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1f8f0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
1f900 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
1f910 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61      *pPgno = nPa
1f920 67 65 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66  ge + 1;..#ifndef
1f930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f940 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1f950 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20  pBt->nTrunc ){. 
1f960 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d       /* An incr-
1f970 76 61 63 75 75 6d 20 68 61 73 20 61 6c 72 65 61  vacuum has alrea
1f980 64 79 20 72 75 6e 20 77 69 74 68 69 6e 20 74 68  dy run within th
1f990 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
1f9a0 53 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  So the.      ** 
1f9b0 70 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  page to allocate
1f9c0 20 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65   is not from the
1f9d0 20 70 68 79 73 69 63 61 6c 20 65 6e 64 20 6f 66   physical end of
1f9e0 20 74 68 65 20 66 69 6c 65 2c 20 62 75 74 0a 20   the file, but. 
1f9f0 20 20 20 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e       ** at pBt->
1fa00 6e 54 72 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a  nTrunc. .      *
1fa10 2f 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  /.      *pPgno =
1fa20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a   pBt->nTrunc+1;.
1fa30 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
1fa40 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1fa50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1fa60 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
1fa70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fa80 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1fa90 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
1faa0 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67  ISPAGE(pBt, *pPg
1fab0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  no) ){.      /* 
1fac0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
1fad0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
1fae0 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
1faf0 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
1fb00 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
1fb10 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
1fb20 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
1fb30 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
1fb40 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
1fb50 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
1fb60 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
1fb70 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
1fb80 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
1fb90 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
1fba0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1fbb0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
1fbc0 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
1fbd0 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
1fbe0 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
1fbf0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1fc00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1fc10 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28  (pBt) );.      (
1fc20 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
1fc30 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
1fc40 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1fc50 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b  Bt) ){ (*pPgno)+
1fc60 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69  +; }.    }.    i
1fc70 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29  f( pBt->nTrunc )
1fc80 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1fc90 75 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20  unc = *pPgno;.  
1fca0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1fcb0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
1fcc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1fcd0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
1fce0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1fcf0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
1fd00 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
1fd10 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1fd20 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1fd30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fd40 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
1fd50 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1fd60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fd70 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1fd80 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
1fd90 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
1fda0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
1fdb0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
1fdc0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
1fdd0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
1fde0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1fdf0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
1fe00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
1fe10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
1fe20 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
1fe30 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
1fe40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1fe50 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61  ../*.** Add a pa
1fe60 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1fe70 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66  se file to the f
1fe80 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73  reelist..**.** s
1fe90 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1fea0 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64  () is NOT called
1feb0 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
1fec0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
1fed0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
1fee0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
1fef0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1ff00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1ff10 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1ff20 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20  1;.  int rc, n, 
1ff30 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65  k;..  /* Prepare
1ff40 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66 72   the page for fr
1ff50 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72  eeing */.  asser
1ff60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ff70 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1ff80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ff90 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
1ffa0 6f 3e 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  o>1 );.  pPage->
1ffb0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65  isInit = 0;.  re
1ffc0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 2d  leasePage(pPage-
1ffd0 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61  >pParent);.  pPa
1ffe0 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
1fff0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
20000 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
20010 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
20020 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
20030 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
20040 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
20050 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
20060 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  c;.  n = get4byt
20070 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
20080 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
20090 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
200a0 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66  [36], n+1);..#if
200b0 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
200c0 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
200d0 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
200e0 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
200f0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
20100 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
20110 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
20120 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
20130 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
20140 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
20150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20160 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
20170 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
20180 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20190 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
201a0 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
201b0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
201c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
201d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
201e0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
201f0 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
20200 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
20210 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
20220 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
20230 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
20240 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
20250 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20  ACUUM ){.    rc 
20260 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
20270 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54   pPage->pgno, PT
20280 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
20290 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
202a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
202b0 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
202c0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
202d0 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
202e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
202f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20300 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
20310 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20320 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73  urn rc;.    mems
20330 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
20340 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34   0, 8);.    put4
20350 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
20360 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
20370 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45  pgno);.    TRACE
20380 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
20390 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65   first\n", pPage
203a0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
203b0 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20  e{.    /* Other 
203c0 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61  free pages alrea
203d0 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69  dy exist.  Retri
203e0 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75  ve the first tru
203f0 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f  nk page.    ** o
20400 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
20410 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20  nd find out how 
20420 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68  many leaves it h
20430 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  as. */.    MemPa
20440 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20  ge *pTrunk;.    
20450 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20460 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65  eGetPage(pBt, ge
20470 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
20480 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72  aData[32]), &pTr
20490 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
204a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
204b0 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74  .    k = get4byt
204c0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
204d0 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e  [4]);.    if( k>
204e0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
204f0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
20500 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20  /* The trunk is 
20510 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20  full.  Turn the 
20520 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
20530 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20   into a new.    
20540 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
20550 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 0a  with no leaves..
20560 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
20570 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
20580 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
20590 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
205a0 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
205b0 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
205c0 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
205d0 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
205e0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
205f0 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
20600 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
20610 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
20620 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
20630 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
20640 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
20650 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
20660 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
20670 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
20680 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
20690 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
206a0 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
206b0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
206c0 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
206d0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
206e0 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
206f0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
20700 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
20710 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
20720 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
20730 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74   contain to rest
20740 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
20750 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
20760 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
20770 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
20780 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
20790 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
207a0 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
207b0 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
207c0 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
207d0 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
207e0 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
207f0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
20800 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
20810 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
20820 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
20830 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
20840 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -8"..      */.  
20850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20860 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
20870 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
208a0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
208b0 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  Data, pTrunk->pg
208c0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  no);.        put
208d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
208e0 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  ata[4], 0);.    
208f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
20900 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
20910 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
20920 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46         TRACE(("F
20930 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
20940 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
20950 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20  acing %d\n",.   
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
20970 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b  ge->pgno, pTrunk
20980 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
20990 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
209a0 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  k<0 ){.      rc 
209b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
209c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
209d0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
209e0 77 6c 79 20 66 72 65 65 64 20 70 61 67 65 20 61  wly freed page a
209f0 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20  s a leaf on the 
20a00 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f  current trunk */
20a10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20a20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
20a30 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
20a40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20a50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20a60 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
20a70 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
20a80 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
20a90 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
20aa0 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61  Data[8+k*4], pPa
20ab0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64  ge->pgno);.#ifnd
20ac0 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
20ad0 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
20ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20af0 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
20b00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64  ->pDbPage);.#end
20b10 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
20b20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
20b30 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
20b40 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
20b50 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
20b60 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
20b70 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
20b80 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20  e(pTrunk);.  }. 
20b90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20ba0 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
20bb0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
20bc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
20bd0 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
20be0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
20bf0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
20c00 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
20c10 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
20c20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
20c30 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
20c40 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
20c50 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
20c60 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
20c70 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67  l;.  int ovflPag
20c80 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
20c90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20ca0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
20cb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
20cc0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
20cd0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
20ce0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
20cf0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
20d00 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
20d10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
20d20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
20d30 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
20d40 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
20d50 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
20d60 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
20d70 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
20d80 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61  flow]);.  ovflPa
20d90 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
20da0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
20db0 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
20dc0 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
20dd0 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
20de0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
20df0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
20e00 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
20e10 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
20e20 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
20e30 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
20e40 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  l;.    if( ovflP
20e50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67  gno==0 || ovflPg
20e60 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
20e70 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
20e80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20e90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20ea0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  PT;.    }..    r
20eb0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
20ec0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
20ed0 6f 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66  o, &pOvfl, (nOvf
20ee0 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e  l==0)?0:&ovflPgn
20ef0 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
20f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20f10 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f  rc = freePage(pO
20f20 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  vfl);.    sqlite
20f30 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
20f40 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
20f50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
20f60 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
20f70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20f80 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
20f90 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
20fa0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
20fb0 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
20fc0 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
20fd0 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
20fe0 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
20ff0 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
21000 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
21010 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
21020 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
21030 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
21040 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
21050 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
21060 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
21070 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
21080 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
21090 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
210a0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
210b0 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
210c0 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
210d0 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
210e0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
210f0 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
21100 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
21110 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
21120 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
21130 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
21140 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
21150 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
21160 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
21170 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
21180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
21190 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
211a0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
211b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
211c0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
211d0 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
211e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
211f0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
21200 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
21210 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
21220 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
21230 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
21240 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
21250 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
21260 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
21270 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
21280 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
212b0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
212c0 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
212d0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
212f0 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
21300 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
21310 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
21320 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
21330 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
21340 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
21350 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
21360 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
21370 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
21380 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
21390 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
213a0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
213b0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
213c0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
213d0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
213e0 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
213f0 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
21400 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
21410 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21420 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
21430 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
21440 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
21450 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
21460 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
21470 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
21480 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
21490 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
214a0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
214b0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
214c0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
214d0 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65  ader], nData+nZe
214e0 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ro);.  }else{.  
214f0 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20    nData = nZero 
21500 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
21510 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
21520 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
21530 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
21540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
21550 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
21560 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
21570 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
21580 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
21590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
215a0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
215b0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
215c0 6e 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65  nData==nData+nZe
215d0 72 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  ro );.  .  /* Fi
215e0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
215f0 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
21600 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
21610 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
21620 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
21630 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
21640 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
21650 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
21660 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  se{.    nPayload
21670 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53   += nKey;.    pS
21680 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
21690 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  Src = nKey;.  }.
216a0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
216b0 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
216c0 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
216d0 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
216e0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
216f0 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
21700 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
21710 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
21720 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
21730 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
21740 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
21750 45 78 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64  Exact = 0;.#ifnd
21760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
21770 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
21780 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
21790 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
217a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
217b0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
217c0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
217d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
217e0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
217f0 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
21800 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
21810 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
21820 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
21830 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
21840 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
21850 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
21860 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
21870 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f         if( pgnoO
21880 76 66 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  vfl>1 ){.       
21890 20 20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20     /* isExact = 
218a0 31 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  1; */.        }.
218b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
218c0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
218d0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
218e0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
218f0 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73  fl, pgnoOvfl, is
21900 45 78 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  Exact);.#ifndef 
21910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
21920 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
21930 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
21940 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
21950 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
21960 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
21970 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
21980 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
21990 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
219a0 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
219b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
219c0 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
219d0 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
219e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
219f0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
21a00 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
21a10 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
21a20 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
21a30 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
21a40 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
21a50 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
21a60 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
21a70 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
21a80 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
21a90 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
21aa0 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
21ab0 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
21ac0 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
21ad0 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
21ae0 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73  itialised values
21af0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
21b00 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
21b10 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
21b20 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
21b30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
21b40 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
21b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21b60 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
21b70 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
21b80 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
21b90 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
21ba0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
21bb0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
21bc0 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
21bd0 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20  gnoPtrmap);.    
21be0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
21bf0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
21c00 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
21c10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
21c20 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
21c30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
21c40 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
21c50 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
21c60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
21c70 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
21c80 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
21c90 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
21ca0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
21cb0 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
21cc0 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
21cd0 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
21ce0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
21cf0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
21d00 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
21d10 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
21d20 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
21d30 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
21d40 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
21d50 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
21d60 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
21d70 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
21d80 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69  spaceLeft;.    i
21d90 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
21da0 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
21db0 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
21dc0 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
21dd0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
21de0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
21df0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21e00 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
21e10 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
21e20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
21e30 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
21e40 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
21e50 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
21e60 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
21e70 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
21e80 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
21e90 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
21ea0 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
21eb0 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
21ec0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
21ed0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
21ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
21ef0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21f00 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74   MemPage.pParent
21f10 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20   pointer on the 
21f20 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65  page whose numbe
21f30 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e  r is.** given in
21f40 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
21f50 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d  ment so that Mem
21f60 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c  Page.pParent hol
21f70 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65  ds the.** pointe
21f80 72 20 69 6e 20 74 68 65 20 74 68 69 72 64 20 61  r in the third a
21f90 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
21fa0 66 20 74 68 65 20 66 69 6e 61 6c 20 61 72 67 75  f the final argu
21fb0 6d 65 6e 74 2c 20 75 70 64 61 74 65 50 74 72 6d  ment, updatePtrm
21fc0 61 70 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ap, is non-zero 
21fd0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
21fe0 0a 2a 2a 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  .** is an auto-v
21ff0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
22000 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
22010 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70  -map entry for p
22020 67 6e 6f 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  gno.** is update
22030 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
22040 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 0a 20   reparentPage(. 
22050 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22070 2a 20 42 2d 54 72 65 65 20 73 74 72 75 63 74 75  * B-Tree structu
22080 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  re */.  Pgno pgn
22090 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
220a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
220b0 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 62 65  mber of child be
220c0 69 6e 67 20 61 64 6f 70 74 65 64 20 2a 2f 0a 20  ing adopted */. 
220d0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
220e0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f  rent,          /
220f0 2a 20 4e 65 77 20 70 61 72 65 6e 74 20 6f 66 20  * New parent of 
22100 70 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 64  pgno */.  int id
22110 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
22120 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
22130 20 6f 66 20 63 68 69 6c 64 20 70 61 67 65 20 70   of child page p
22140 67 6e 6f 20 69 6e 20 70 4e 65 77 50 61 72 65 6e  gno in pNewParen
22150 74 20 2a 2f 0a 20 20 69 6e 74 20 75 70 64 61 74  t */.  int updat
22160 65 50 74 72 6d 61 70 20 20 20 20 20 20 20 20 20  ePtrmap         
22170 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
22180 20 75 70 64 61 74 65 20 70 6f 69 6e 74 65 72 2d   update pointer-
22190 6d 61 70 20 66 6f 72 20 70 67 6e 6f 20 2a 2f 0a  map for pgno */.
221a0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
221b0 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70  his;.  DbPage *p
221c0 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
221d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
221e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
221f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
22200 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  NewParent!=0 );.
22210 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
22220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22230 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
22240 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
22250 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
22260 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
22270 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
22280 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
22290 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d  {.    pThis = (M
222a0 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
222b0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
222c0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
222d0 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b  pThis->isInit ){
222e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
222f0 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  This->aData==sql
22300 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
22310 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  (pDbPage) );.   
22320 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50     if( pThis->pP
22330 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e  arent!=pNewParen
22340 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
22350 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
22360 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
22370 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65  ref(pThis->pPare
22380 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
22390 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61        pThis->pPa
223a0 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e  rent = pNewParen
223b0 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
223c0 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50  e3PagerRef(pNewP
223d0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
223e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
223f0 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20  This->idxParent 
22400 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  = idx;.    }.   
22410 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
22420 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
22430 0a 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  ..  if( ISAUTOVA
22440 43 55 55 4d 20 26 26 20 75 70 64 61 74 65 50 74  CUUM && updatePt
22450 72 6d 61 70 20 29 7b 0a 20 20 20 20 72 65 74 75  rmap ){.    retu
22460 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74  rn ptrmapPut(pBt
22470 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  , pgno, PTRMAP_B
22480 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74  TREE, pNewParent
22490 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 23 69  ->pgno);.  }..#i
224a0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
224b0 2a 20 49 66 20 74 68 65 20 75 70 64 61 74 65 50  * If the updateP
224c0 74 72 6d 61 70 20 66 6c 61 67 20 77 61 73 20 63  trmap flag was c
224d0 6c 65 61 72 2c 20 61 73 73 65 72 74 20 74 68 61  lear, assert tha
224e0 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74  t the entry in t
224f0 68 65 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 2d  he.  ** pointer-
22500 6d 61 70 20 69 73 20 61 6c 72 65 61 64 79 20 63  map is already c
22510 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  orrect..  */.  i
22520 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
22530 29 7b 0a 20 20 20 20 70 44 62 50 61 67 65 20 3d  ){.    pDbPage =
22540 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
22550 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
22560 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
22570 74 2c 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66  t,pgno));.    if
22580 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
22590 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
225a0 20 20 20 50 67 6e 6f 20 69 69 3b 0a 20 20 20 20     Pgno ii;.    
225b0 20 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d 61    int rc = ptrma
225c0 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20  pGet(pBt, pgno, 
225d0 26 65 54 79 70 65 2c 20 26 69 69 29 3b 0a 20 20  &eType, &ii);.  
225e0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
225f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3d  SQLITE_OK && ii=
22600 3d 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e  =pNewParent->pgn
22610 6f 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  o && eType==PTRM
22620 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
22630 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
22640 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
22650 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
22660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22670 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43  OK;.}..../*.** C
22680 68 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e  hange the pParen
22690 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c  t pointer of all
226a0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
226b0 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b  ge to point back
226c0 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a  .** to pPage..**
226d0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
226e0 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68  ds, for every ch
226f0 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e  ild of pPage, in
22700 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67  voke reparentPag
22710 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73  e().** to make s
22720 75 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68  ure that each ch
22730 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70  ild knows that p
22740 50 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65  Page is its pare
22750 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
22760 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
22770 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d  ed after you mem
22780 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69  cpy() one page i
22790 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a  nto.** another..
227a0 2a 2a 0a 2a 2a 20 49 66 20 75 70 64 61 74 65 50  **.** If updateP
227b0 74 72 6d 61 70 20 69 73 20 74 72 75 65 2c 20 74  trmap is true, t
227c0 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
227d0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
227e0 61 6c 6c 20 63 68 69 6c 64 0a 2a 2a 20 70 61 67  all child.** pag
227f0 65 73 20 6f 66 20 70 50 61 67 65 20 61 72 65 20  es of pPage are 
22800 75 70 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  updated..*/.stat
22810 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43  ic int reparentC
22820 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67  hildPages(MemPag
22830 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 75 70  e *pPage, int up
22840 64 61 74 65 50 74 72 6d 61 70 29 7b 0a 20 20 69  datePtrmap){.  i
22850 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22860 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  K;.  assert( sql
22870 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22880 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22890 78 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  x) );.  if( !pPa
228a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
228b0 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
228c0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
228d0 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20  ->pBt;.    Pgno 
228e0 69 52 69 67 68 74 20 3d 20 67 65 74 34 62 79 74  iRight = get4byt
228f0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
22900 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
22910 2b 38 5d 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  +8]);..    for(i
22920 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
22930 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
22940 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
22950 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
22960 20 20 20 20 20 20 72 63 20 3d 20 72 65 70 61 72        rc = repar
22970 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  entPage(pBt, get
22980 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50  4byte(pCell), pP
22990 61 67 65 2c 20 69 2c 20 75 70 64 61 74 65 50 74  age, i, updatePt
229a0 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 69 66 28  rmap);.      if(
229b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
229c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
229d0 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  }.    rc = repar
229e0 65 6e 74 50 61 67 65 28 70 42 74 2c 20 69 52 69  entPage(pBt, iRi
229f0 67 68 74 2c 20 70 50 61 67 65 2c 20 69 2c 20 75  ght, pPage, i, u
22a00 70 64 61 74 65 50 74 72 6d 61 70 29 3b 0a 20 20  pdatePtrmap);.  
22a10 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
22a20 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
22a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22a40 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
22a50 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
22a60 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
22a70 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
22a80 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
22a90 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
22aa0 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
22ab0 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
22ac0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
22ad0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
22ae0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
22af0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
22b00 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
22b10 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
22b20 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
22b30 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
22b40 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
22b50 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
22b60 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
22b70 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
22b80 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
22b90 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
22ba0 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20   idx, int sz){. 
22bb0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
22bc0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22bd0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
22be0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
22bf0 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
22c00 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
22c10 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
22c20 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
22c30 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
22c40 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
22c50 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
22c60 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
22c70 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20  hin data[] */.. 
22c80 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
22c90 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
22ca0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
22cb0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
22cc0 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
22cd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
22ce0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
22cf0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
22d00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22d10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
22d20 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
22d30 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
22d40 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
22d50 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
22d60 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
22d70 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
22d80 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73  2byte(ptr);.  as
22d90 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70  sert( pc>10 && p
22da0 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz<=pPage->pBt
22db0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
22dc0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67    freeSpace(pPag
22dd0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f  e, pc, sz);.  fo
22de0 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
22df0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
22e00 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
22e10 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
22e20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
22e30 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
22e40 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
22e50 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
22e60 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
22e70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
22e80 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
22e90 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53  2;.  pPage->idxS
22ea0 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  hift = 1;.}../*.
22eb0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
22ec0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
22ed0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
22ee0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
22ef0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
22f00 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
22f10 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
22f20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
22f30 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
22f40 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
22f50 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
22f60 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
22f70 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
22f80 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
22f90 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
22fa0 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
22fb0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
22fc0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
22fd0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
22fe0 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
22ff0 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
23000 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
23010 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
23020 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
23030 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
23040 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
23050 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
23060 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
23070 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
23080 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
23090 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
230a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
230b0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
230c0 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
230d0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
230e0 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
230f0 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
23100 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
23110 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
23120 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
23130 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
23140 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
23150 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
23160 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
23170 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
23180 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
23190 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
231a0 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
231b0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
231c0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
231d0 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
231e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
231f0 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
23200 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
23210 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
23220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23230 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
23240 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
23250 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
23260 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
23270 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
23280 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
23290 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
232a0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
232b0 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
232c0 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
232d0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
232e0 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
232f0 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
23300 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
23310 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
23320 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
23330 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
23340 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
23350 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
23360 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
23370 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
23380 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
23390 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
233a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
233b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
233c0 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
233d0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
233e0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
233f0 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
23400 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
23410 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
23420 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
23430 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
23440 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
23450 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
23460 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
23470 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
23480 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
23490 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
234a0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
234b0 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
234c0 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
234d0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
234e0 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
234f0 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
23500 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
23510 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
23520 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
23530 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
23540 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
23550 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
23560 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
23570 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
23580 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
23590 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
235a0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
235b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
235c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
235d0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
235e0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
235f0 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73   pCell) );.  ass
23600 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23610 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
23620 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
23630 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
23640 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
23650 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
23660 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
23670 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
23680 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
23690 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
236a0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
236b0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  emp;.    }.    j
236c0 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
236d0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
236e0 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67  t( j<sizeof(pPag
236f0 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66  e->aOvfl)/sizeof
23700 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d  (pPage->aOvfl[0]
23710 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
23720 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
23730 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
23740 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
23750 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = i;.    pPage->
23760 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nFree = 0;.  }el
23770 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
23780 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23790 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
237a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
237b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
237c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
237d0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
237e0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
237f0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
23800 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
23810 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
23820 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50  ta;.    hdr = pP
23830 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
23840 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
23850 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
23860 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
23870 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
23880 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
23890 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
238a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b  Page->nCell + 2;
238b0 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
238c0 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
238d0 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d   if( end > top -
238e0 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 64 65 66   sz ){.      def
238f0 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
23900 65 29 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20  e);.      top = 
23910 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
23920 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
23930 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
23940 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
23950 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
23960 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
23970 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
23980 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
23990 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
239a0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
239b0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
239c0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
239d0 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a  ge->nFree -= 2;.
239e0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
239f0 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
23a00 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
23a10 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65  ip);.    for(j=e
23a20 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b  nd-2, ptr=&data[
23a30 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c  j]; j>ins; j-=2,
23a40 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20   ptr-=2){.      
23a50 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d  ptr[0] = ptr[-2]
23a60 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d  ;.      ptr[1] =
23a70 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a   ptr[-1];.    }.
23a80 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
23a90 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
23aa0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
23ab0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
23ac0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
23ad0 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
23ae0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
23af0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
23b00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
23b10 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
23b20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
23b30 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
23b40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
23b50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
23b60 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
23b70 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
23b80 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
23b90 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
23ba0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
23bb0 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49    */.      CellI
23bc0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
23bd0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
23be0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
23bf0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
23c00 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e       assert( (in
23c10 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
23c20 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
23c30 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
23c40 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66  load );.      if
23c50 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
23c60 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
23c70 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e  nfo.nKey))>info.
23c80 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
23c90 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
23ca0 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
23cb0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
23cc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
23cd0 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
23ce0 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  ->pBt, pgnoOvfl,
23cf0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
23d00 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
23d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
23d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
23d30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
23d40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
23d50 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
23d60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
23d70 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
23d80 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
23d90 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
23da0 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
23db0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
23dc0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
23dd0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
23de0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
23df0 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
23e00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
23e10 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
23e20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
23e30 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
23e40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
23e50 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
23e60 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
23e70 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
23e80 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
23e90 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
23ea0 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
23eb0 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
23ec0 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
23ed0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23ef0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
23f00 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20   int totalSize; 
23f10 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
23f20 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f   of all cells */
23f30 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
23f40 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
23f50 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
23f60 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20    int cellptr;  
23f70 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
23f80 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
23f90 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
23fa0 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
23fb0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
23fc0 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
23fd0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
23fe0 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70  * Data for the p
23ff0 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
24000 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
24010 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
24020 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24030 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
24040 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f  ->mutex) );.  to
24050 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66  talSize = 0;.  f
24060 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
24070 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c   i++){.    total
24080 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  Size += aSize[i]
24090 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
240a0 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c  totalSize+2*nCel
240b0 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  l<=pPage->nFree 
240c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
240d0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
240e0 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67    cellptr = pPag
240f0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
24100 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
24110 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
24120 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
24130 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
24140 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
24150 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a  .  if( nCell ){.
24160 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61      cellbody = a
24170 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
24180 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  ge, totalSize);.
24190 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
241a0 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73  body>0 );.    as
241b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
241c0 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b  ee >= 2*nCell );
241d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
241e0 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  e -= 2*nCell;.  
241f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
24200 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
24210 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  put2byte(&data[c
24220 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64  ellptr], cellbod
24230 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  y);.      memcpy
24240 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
24250 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
24260 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65  ze[i]);.      ce
24270 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
24280 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53    cellbody += aS
24290 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
242a0 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
242b0 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  dy==pPage->pBt->
242c0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
242d0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
242e0 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a   = nCell;.}../*.
242f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24300 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
24310 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
24320 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
24330 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
24340 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
24350 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
24360 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
24370 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
24380 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
24390 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
243a0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
243b0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
243c0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
243d0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
243e0 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
243f0 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
24400 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
24410 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
24420 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
24430 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
24440 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
24450 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
24460 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
24470 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
24480 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
24490 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
244a0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
244b0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
244c0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
244d0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
244e0 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
244f0 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
24500 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
24510 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
24520 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
24530 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
24540 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
24550 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
24560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24570 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
24580 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
24590 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
245a0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
245b0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
245c0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
245d0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
245e0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
245f0 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
24600 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50  int balance(MemP
24610 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66  age*, int);..#if
24620 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24630 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
24640 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
24650 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
24660 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
24670 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
24680 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
24690 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
246a0 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
246b0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
246c0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
246d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
246e0 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
246f0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
24700 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
24710 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
24720 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
24730 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
24740 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
24750 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
24760 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
24770 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
24780 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
24790 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
247a0 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
247b0 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
247c0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
247d0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
247e0 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
247f0 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
24800 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
24810 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
24820 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
24830 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
24840 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
24850 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
24860 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
24870 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
24880 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
24890 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
248a0 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
248b0 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
248c0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
248d0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
248e0 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
248f0 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
24900 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
24910 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
24920 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
24930 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
24940 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24950 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
24960 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d  emPage *pPage, M
24970 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29  emPage *pParent)
24980 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
24990 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50  mPage *pNew;.  P
249a0 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75  gno pgnoNew;.  u
249b0 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20  8 *pCell;.  u16 
249c0 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e  szCell;.  CellIn
249d0 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61  fo info;.  BtSha
249e0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
249f0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72  ->pBt;.  int par
24a00 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74  entIdx = pParent
24a10 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50  ->nCell;   /* pP
24a20 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65  arent new divide
24a30 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  r cell index */.
24a40 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65    int parentSize
24a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24a60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
24a70 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
24a80 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65  */.  u8 parentCe
24a90 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20  ll[64];         
24aa0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
24ab0 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69  for the new divi
24ac0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61  der cell */..  a
24ad0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24ae0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
24af0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
24b00 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
24b10 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72   new page. Inser
24b20 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  t the overflow c
24b30 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20  ell from pPage. 
24b40 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65   ** into it. The
24b50 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65  n remove the ove
24b60 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
24b70 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  pPage..  */.  rc
24b80 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
24b90 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
24ba0 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
24bb0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24bc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
24bd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
24be0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
24bf0 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73  fl[0].pCell;.  s
24c00 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
24c10 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
24c20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  );.  zeroPage(pN
24c30 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ew, pPage->aData
24c40 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65  [0]);.  assemble
24c50 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
24c60 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
24c70 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
24c80 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65  ow = 0;..  /* Se
24c90 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  t the parent of 
24ca0 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
24cb0 74 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72  ted page to pPar
24cc0 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  ent. */.  pNew->
24cd0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e  pParent = pParen
24ce0 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
24cf0 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
24d00 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50  bPage);..  /* pP
24d10 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
24d20 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
24d30 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61   of pParent. Cha
24d40 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f  nge this.  ** so
24d50 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
24d60 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77  child is the new
24d70 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   page allocated 
24d80 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70  above and.  ** p
24d90 50 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74  Page is the next
24da0 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e  -to-right child.
24db0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 67 6e 6f   .  **.  ** Igno
24dc0 72 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  re the return va
24dd0 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20  lue of the call 
24de0 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e  to fillInCell().
24df0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20   fillInCell().  
24e00 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75  ** may only retu
24e10 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  rn other than SQ
24e20 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69 73  LITE_OK if it is
24e30 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 6c   required to all
24e40 6f 63 61 74 65 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ocate.  ** one o
24e50 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
24e60 70 61 67 65 73 2e 20 53 69 6e 63 65 20 61 6e 20  pages. Since an 
24e70 69 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65 20 42  internal table B
24e80 2d 54 72 65 65 20 63 65 6c 6c 20 0a 20 20 2a 2a  -Tree cell .  **
24e90 20 6d 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c   may never spill
24ea0 20 6f 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76   over onto an ov
24eb0 65 72 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20  erflow page (it 
24ec0 69 73 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  is a maximum of 
24ed0 0a 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69  .  ** 13 bytes i
24ee0 6e 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e  n size), it is n
24ef0 6f 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f  ot neccessary to
24f00 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
24f10 6e 20 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a  n code..  **.  *
24f20 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65  * Similarly, the
24f30 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75   insertCell() fu
24f40 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
24f50 69 6c 20 69 66 20 74 68 65 20 70 61 67 65 0a 20  il if the page. 
24f60 20 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74   ** being insert
24f70 65 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61  ed into is alrea
24f80 64 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20  dy writable and 
24f90 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f  the cell does no
24fa0 74 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20  t .  ** contain 
24fb0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e  an overflow poin
24fc0 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  ter. So ignore t
24fd0 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20  his return code 
24fe0 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  too..  */.  asse
24ff0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
25000 3e 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20  >0 );.  pCell = 
25010 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
25020 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
25030 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
25040 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
25050 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
25060 3b 0a 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  ;.  fillInCell(p
25070 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65  Parent, parentCe
25080 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
25090 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65  , 0, 0, 0, &pare
250a0 6e 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  ntSize);.  asser
250b0 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34  t( parentSize<64
250c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
250d0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
250e0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
250f0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 6e 73  DbPage) );.  ins
25100 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
25110 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65   parentIdx, pare
25120 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69  ntCell, parentSi
25130 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 70 75 74  ze, 0, 4);.  put
25140 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
25150 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70  owCell(pParent,p
25160 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65  arentIdx), pPage
25170 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62  ->pgno);.  put4b
25180 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
25190 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
251a0 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
251b0 65 77 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ew);..  /* If th
251c0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
251d0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
251e0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
251f0 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20  r map.  ** with 
25200 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
25210 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
25220 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
25230 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  he .  ** cell on
25240 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
25250 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
25260 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
25270 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63  VACUUM ){.    rc
25280 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
25290 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
252a0 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
252b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
252c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
252d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
252e0 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
252f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
25300 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25310 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
25320 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 20  ePage(pNew);.   
25330 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25340 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
25350 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
25360 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
25370 61 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20  age and balance 
25380 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
25390 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
253a0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  e divider cell i
253b0 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69  nserted caused i
253c0 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72  t to become over
253d0 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c  full..  */.  rel
253e0 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
253f0 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65    return balance
25400 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a  (pParent, 0);.}.
25410 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
25420 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
25430 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  CE */../*.** Thi
25440 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
25450 72 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e  ributes Cells on
25460 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
25470 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a   NN*2 siblings.*
25480 2a 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68  * of pPage so th
25490 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
254a0 65 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65  e about the same
254b0 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
254c0 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c  space..** Usuall
254d0 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  y NN siblings on
254e0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
254f0 70 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e  pPage is used in
25500 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a   the balancing,.
25510 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73  ** though more s
25520 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f  iblings might co
25530 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  me from one side
25540 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
25550 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73   first.** or las
25560 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
25570 61 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65  arent.  If pPage
25580 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
25590 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  2*NN siblings.**
255a0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
255b0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
255c0 6e 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68  n if pPage is th
255d0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  e root page or a
255e0 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f   .** child of ro
255f0 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ot) then all ava
25600 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20  ilable siblings 
25610 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
25620 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
25630 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
25640 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  f siblings of pP
25650 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  age might be inc
25660 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61  reased or decrea
25670 73 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a  sed by one or.**
25680 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
25690 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
256a0 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
256b0 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54  not over full. T
256c0 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20  he root page.** 
256d0 69 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69  is special and i
256e0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  s allowed to be 
256f0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66  nearly empty. If
25700 20 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68   pPage is .** th
25710 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  e root page, the
25720 6e 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  n the depth of t
25730 68 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65  he tree might be
25740 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72   increased.** or
25750 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
25760 65 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c  e, as necessary,
25770 20 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f   to keep the roo
25780 74 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  t page from bein
25790 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72  g.** overfull or
257a0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
257b0 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
257c0 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  at when this rou
257d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
257e0 73 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  some of the Cell
257f0 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69  s on pPage.** mi
25800 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
25810 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
25820 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54  age->aData[].  T
25830 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
25840 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
25850 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74   overfull.  Part
25860 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74   of the job of t
25870 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
25880 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61  o.** make sure a
25890 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61  ll Cells for pPa
258a0 67 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69  ge once again fi
258b0 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  t in pPage->aDat
258c0 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  a[]..**.** In th
258d0 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61  e course of bala
258e0 6e 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e  ncing the siblin
258f0 67 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  gs of pPage, the
25900 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65   parent of pPage
25910 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  .** might become
25920 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
25930 65 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74  erfull.  If that
25940 20 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74   happens, then t
25950 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
25960 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  s called recursi
25970 76 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65  vely on the pare
25980 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
25990 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
259a0 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
259b0 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
259c0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
259d0 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
259e0 61 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  ate.  So if this
259f0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
25a00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
25a10 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
25a20 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
25a30 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
25a40 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50  root(MemPage *pP
25a50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
25a60 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20  *pParent;       
25a70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65       /* The pare
25a80 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  nt of pPage */. 
25a90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25ab0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
25ac0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
25ad0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
25ae0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25af0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
25b00 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
25b10 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
25b20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
25b30 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
25b40 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
25b50 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  m. */.  int nOld
25b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25b70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25b80 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
25b90 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  [] */.  int nNew
25ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25bb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25bc0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
25bd0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76  [] */.  int nDiv
25be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25bf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25c00 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76  f cells in apDiv
25c10 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
25c20 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
25c30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
25c40 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
25c50 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
25c60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25c70 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61   of pPage in pPa
25c80 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
25c90 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cb0 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
25cc0 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
25cd0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
25ce0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
25cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25d00 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
25d10 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65  .  int leafCorre
25d20 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
25d30 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
25d40 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
25d50 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
25d60 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
25d70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
25d80 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
25d90 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
25da0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
25db0 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
25dc0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
25dd0 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
25de0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
25df0 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
25e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
25e10 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
25e20 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
25e30 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
25e40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
25e50 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
25e60 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
25e70 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
25e80 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
25e90 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
25ea0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
25eb0 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
25ec0 69 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20  iSpace2 = 0;    
25ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
25ee0 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
25ef0 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20   aSpace2[] */.  
25f00 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20  int szScratch;  
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20  Size of scratch 
25f30 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64  memory requested
25f40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
25f50 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
25f60 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
25f70 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
25f80 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
25f90 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  oOld[NB];       
25fa0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
25fb0 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
25fc0 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  ge in apOld[] */
25fd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
25fe0 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
25ff0 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
26000 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
26010 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
26020 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
26030 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
26040 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
26050 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
26060 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ing */.  Pgno pg
26070 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  noNew[NB+2];    
26080 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
26090 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70  mbers for each p
260a0 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  age in apNew[] *
260b0 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
260c0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
260d0 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
260e0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
260f0 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
26100 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
26110 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
26120 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
26130 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
26140 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26160 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
26170 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
26180 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
26190 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
261a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
261b0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
261c0 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
261d0 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
261e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
261f0 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
26200 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
26210 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b   */.  u8 *aCopy[
26220 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
26230 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e  Space for holdin
26240 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79  g data of apCopy
26250 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
26260 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ce1;           /
26270 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
26280 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
26290 65 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61  ells before bala
262a0 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  nce */.  u8 *aSp
262b0 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ace2 = 0;       
262c0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65  /* Space for ove
262d0 72 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63  rflow dividers c
262e0 65 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ells after balan
262f0 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f  ce */.  u8 *aFro
26300 6d 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  m = 0;..  assert
26310 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
26320 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
26330 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
26340 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20   .  ** Find the 
26350 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a  parent page..  *
26360 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
26370 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
26380 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
26390 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
263a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c  Page->pDbPage) |
263b0 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
263c0 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d  ow==1 );.  pBt =
263d0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70   pPage->pBt;.  p
263e0 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
263f0 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
26400 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20  t( pParent );.  
26410 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
26420 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26430 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
26440 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
26450 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
26460 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
26470 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25  CE: begin page %
26480 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22  d child of %d\n"
26490 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
264a0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a  Parent->pgno));.
264b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
264c0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
264d0 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70  E.  /*.  ** A sp
264e0 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20  ecial case:  If 
264f0 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20  a new entry has 
26500 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74  just been insert
26510 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ed into a.  ** t
26520 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61  able (that is, a
26530 20 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65   btree with inte
26540 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c  ger keys and all
26550 20 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61   data at the lea
26560 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ves).  ** and th
26570 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74  e new entry is t
26580 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
26590 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20  try in the tree 
265a0 28 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a  (it has the.  **
265b0 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68   largest key) th
265c0 65 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69  en use the speci
265d0 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  al balance_quick
265e0 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20  () routine for. 
265f0 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20   ** balancing.  
26600 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
26610 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61  is much faster a
26620 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  nd results in a 
26630 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63  tighter.  ** pac
26640 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20  king of data in 
26650 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
26660 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
26670 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20  e->leaf &&.     
26680 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
26690 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  &.      pPage->n
266a0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20  Overflow==1 &&. 
266b0 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66       pPage->aOvf
266c0 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
266d0 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20  >nCell &&.      
266e0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e  pPage->pParent->
266f0 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20  pgno!=1 &&.     
26700 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
26710 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
26720 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
26730 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20  ==pPage->pgno.  
26740 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26750 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a  Page->intKey );.
26760 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f      /*.    ** TO
26770 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69  DO: Check the si
26780 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65  blings to the le
26790 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20  ft of pPage. It 
267a0 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20  may be that.    
267b0 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ** they are not 
267c0 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20  full and no new 
267d0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
267e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
267f0 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  urn balance_quic
26800 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  k(pPage, pParent
26810 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
26820 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
26830 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
26840 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
26850 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
26860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
26870 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
26880 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70  he cell in the p
26890 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65  arent page whose
268a0 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e   left child poin
268b0 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20  ts back.  ** to 
268c0 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78  pPage.  The "idx
268d0 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68  " variable is th
268e0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
268f0 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a  cell.  If pPage.
26900 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68    ** is the righ
26910 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  tmost child of p
26920 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20  Parent then set 
26930 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e  idx to pParent->
26940 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66  nCell .  */.  if
26950 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68  ( pParent->idxSh
26960 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ift ){.    Pgno 
26970 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  pgno;.    pgno =
26980 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20   pPage->pgno;.  
26990 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d    assert( pgno==
269a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
269b0 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
269c0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f  bPage) );.    fo
269d0 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61  r(idx=0; idx<pPa
269e0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78  rent->nCell; idx
269f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67  ++){.      if( g
26a00 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
26a10 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d  (pParent, idx))=
26a20 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  =pgno ){.       
26a30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26a40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26a50 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ( idx<pParent->n
26a60 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Cell.           
26a70 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70    || get4byte(&p
26a80 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
26a90 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
26aa0 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  +8])==pgno );.  
26ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d  }else{.    idx =
26ac0 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
26ad0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  t;.  }..  /*.  *
26ae0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72  * Initialize var
26af0 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69  iables so that i
26b00 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74  t will be safe t
26b10 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65  o jump.  ** dire
26b20 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f  ctly to balance_
26b30 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d  cleanup at any m
26b40 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  oment..  */.  nO
26b50 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20  ld = nNew = 0;. 
26b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
26b70 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
26b80 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  e);..  /*.  ** F
26b90 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ind sibling page
26ba0 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74  s to pPage and t
26bb0 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
26bc0 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a  ent that divide.
26bd0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
26be0 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69  s.  An attempt i
26bf0 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
26c00 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
26c10 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f  ther.  ** side o
26c20 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73  f pPage.  More s
26c30 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
26c40 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
26c50 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a   however, if.  *
26c60 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72  * pPage there ar
26c70 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
26c80 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
26c90 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20  other side.  If 
26ca0 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
26cb0 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
26cc0 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
26cd0 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
26ce0 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20  nt are taken..  
26cf0 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78  */.  nxDiv = idx
26d00 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44   - NN;.  if( nxD
26d10 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e  iv + NB > pParen
26d20 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
26d30 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d  nxDiv = pParent-
26d40 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b  >nCell - NB + 1;
26d50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
26d60 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <0 ){.    nxDiv 
26d70 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20  = 0;.  }.  nDiv 
26d80 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 0;.  for(i=0, 
26d90 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69  k=nxDiv; i<NB; i
26da0 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, k++){.    if
26db0 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  ( k<pParent->nCe
26dc0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ll ){.      apDi
26dd0 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
26de0 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20  pParent, k);.   
26df0 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20     nDiv++;.     
26e00 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e   assert( !pParen
26e10 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20  t->leaf );.     
26e20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
26e30 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
26e40 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26e50 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  k==pParent->nCel
26e60 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  l ){.      pgnoO
26e70 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65  ld[i] = get4byte
26e80 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
26e90 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
26ea0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
26eb0 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
26ec0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
26ed0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
26ee0 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20  Bt, pgnoOld[i], 
26ef0 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65  &apOld[i], pPare
26f00 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
26f10 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
26f20 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c  leanup;.    apOl
26f30 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20  d[i]->idxParent 
26f40 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b  = k;.    apCopy[
26f50 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  i] = 0;.    asse
26f60 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20  rt( i==nOld );. 
26f70 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e     nOld++;.    n
26f80 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
26f90 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
26fa0 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
26fb0 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  w;.  }..  /* Mak
26fc0 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
26fd0 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
26fe0 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
26ff0 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
27000 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
27010 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
27020 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
27030 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
27040 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
27050 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
27060 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
27070 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
27080 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
27090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270a0 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
270b0 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
270c0 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
270f0 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69      + (ROUND8(si
27100 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70  zeof(MemPage))+p
27110 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42  Bt->pageSize)*NB
27120 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20    /* aCopy */.  
27130 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
27140 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27160 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
27170 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43      + (ISAUTOVAC
27180 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20  UUM ? nMaxCells 
27190 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  : 0);           
271a0 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20    /* aFrom */.  
271b0 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
271c0 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
271d0 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
271e0 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
271f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27200 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
27210 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27220 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
27230 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (u16*)&apCell[nM
27240 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70  axCells];.  aCop
27250 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43  y[0] = (u8*)&szC
27260 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
27270 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
27280 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[0] - (u8*)apCe
27290 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
272a0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
272b0 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
272c0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
272d0 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
272e0 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
272f0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
27300 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
27310 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
27320 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
27330 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
27340 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
27350 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
27360 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  quired */.  }.  
27370 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79  aSpace1 = &aCopy
27380 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
27390 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
273a0 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
273b0 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63   assert( ((aSpac
273c0 65 31 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  e1 - (u8*)apCell
273d0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
273e0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
273f0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
27400 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
27410 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26  ){.    aFrom = &
27420 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
27430 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53  eSize];.  }.  aS
27440 70 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50  pace2 = sqlite3P
27450 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70  ageMalloc(pBt->p
27460 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
27470 61 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20  aSpace2==0 ){.  
27480 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
27490 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
274a0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
274b0 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20   }.  .  /*.  ** 
274c0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
274d0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50  he content of pP
274e0 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
274f0 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d  ings into aOld[]
27500 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20  ..  ** The rest 
27510 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
27520 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
27530 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
27540 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ather.  ** that 
27550 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
27560 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
27570 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
27580 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20   be in the.  ** 
27590 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
275a0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20   overwritten..  
275b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
275c0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
275d0 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43  MemPage *p = apC
275e0 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
275f0 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20  e*)aCopy[i];.   
27600 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64   memcpy(p, apOld
27610 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
27620 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44  age));.    p->aD
27630 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b  ata = (void*)&p[
27640 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
27650 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
27660 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
27670 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
27680 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
27690 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
276a0 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
276b0 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
276c0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
276d0 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
276e0 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
276f0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
27700 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
27710 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
27720 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61   obtained form a
27730 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d  Space1[] and rem
27740 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69  ove the the divi
27750 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66  der Cells.  ** f
27760 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
27770 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
27780 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
27790 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
277a0 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
277b0 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
277c0 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
277d0 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
277e0 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
277f0 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
27800 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
27810 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
27820 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
27830 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
27840 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
27850 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
27860 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
27870 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
27880 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
27890 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
278a0 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
278b0 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
278c0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
278d0 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
278e0 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
278f0 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
27900 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
27910 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
27920 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
27930 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
27940 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
27950 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
27960 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
27970 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
27980 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61  nCell = 0;.  lea
27990 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50  fCorrection = pP
279a0 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  age->leaf*4;.  l
279b0 65 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d  eafData = pPage-
279c0 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
279d0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
279e0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
279f0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
27a00 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20  ;.    int limit 
27a10 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
27a20 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
27a30 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
27a40 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
27a50 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
27a60 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
27a70 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
27a80 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
27a90 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20  ll(pOld, j);.   
27aa0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
27ab0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
27ac0 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c  Old, apCell[nCel
27ad0 6c 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  l]);.      if( I
27ae0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
27af0 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20         int a;.  
27b00 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
27b10 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  l] = i;.        
27b20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d  for(a=0; a<pOld-
27b30 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29  >nOverflow; a++)
27b40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
27b50 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70  pOld->aOvfl[a].p
27b60 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65  Cell==apCell[nCe
27b70 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ll] ){.         
27b80 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
27b90 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
27ba0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
27bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
27bd0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
27be0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29    if( i<nOld-1 )
27bf0 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
27c00 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
27c10 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
27c20 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
27c30 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
27c40 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44  * With the LEAFD
27c50 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e  ATA flag, pParen
27c60 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c  t cells hold onl
27c70 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20  y INTKEYs that. 
27c80 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75         ** are du
27c90 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73  plicates of keys
27ca0 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61   on the child pa
27cb0 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ges.  We need to
27cc0 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20   remove.        
27cd0 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ** the divider c
27ce0 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e  ells from pParen
27cf0 74 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64  t, but the divid
27d00 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f  ers cells are no
27d10 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  t.        ** add
27d20 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62  ed to apCell[] b
27d30 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
27d40 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68  duplicates of ch
27d50 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20  ild cells..     
27d60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72     */.        dr
27d70 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
27d80 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
27d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27da0 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
27db0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
27dc0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
27dd0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
27de0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
27df0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
27e00 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20  ce1[iSpace1];.  
27e10 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d        iSpace1 +=
27e20 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73   sz;.        ass
27e30 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
27e40 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
27e50 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
27e60 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce1<=pBt->pageSi
27e70 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
27e80 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
27e90 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
27ea0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
27eb0 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
27ec0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20  rection;.       
27ed0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
27ee0 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  M ){.          a
27ef0 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
27f00 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  FF;.        }.  
27f10 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
27f20 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73  Parent, nxDiv, s
27f30 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  z);.        szCe
27f40 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61  ll[nCell] -= lea
27f50 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
27f60 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74       assert( get
27f70 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67  4byte(pTemp)==pg
27f80 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20  noOld[i] );.    
27f90 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
27fa0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
27fb0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
27fc0 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
27fd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
27fe0 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
27ff0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
28000 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
28010 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a  left.          *
28020 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
28030 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
28040 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28050 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
28060 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f   &pOld->aData[pO
28070 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
28080 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
28090 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
280a0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
280b0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
280c0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
280d0 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
280e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
280f0 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c  ot allow any cel
28100 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ls smaller than 
28110 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
28120 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
28130 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
28140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28150 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
28160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28170 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
28180 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75  igure out the nu
28190 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65  mber of pages ne
281a0 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  eded to hold all
281b0 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20   nCell cells..  
281c0 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75  ** Store this nu
281d0 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c  mber in "k".  Al
281e0 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77  so compute szNew
281f0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
28200 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20  total.  ** size 
28210 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  of all cells on 
28220 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e  the i-th page an
28230 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68  d cntNew[] which
28240 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   is the index.  
28250 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f  ** in apCell[] o
28260 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
28270 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66  divides page i f
28280 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a  rom page i+1.  .
28290 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73    ** cntNew[k] s
282a0 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c  hould equal nCel
282b0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c  l..  **.  ** Val
282c0 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ues computed by 
282d0 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a  this block:.  **
282e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
282f0 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  k: The total num
28300 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70  ber of sibling p
28310 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e  ages.  **    szN
28320 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73  ew[i]: Spaced us
28330 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73  ed on the i-th s
28340 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
28350 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49  *   cntNew[i]: I
28360 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ndex in apCell[]
28370 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f   and szCell[] fo
28380 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  r the first cell
28390 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   to.  **        
283a0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20        the right 
283b0 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  of the i-th sibl
283c0 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75  ing page..  ** u
283d0 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62  sableSpace: Numb
283e0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
283f0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  pace available o
28400 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a  n each sibling..
28410 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61    ** .  */.  usa
28420 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e  bleSpace = pBt->
28430 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20  usableSize - 12 
28440 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
28450 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c  ;.  for(subtotal
28460 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  =k=i=0; i<nCell;
28470 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
28480 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( i<nMaxCells )
28490 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b  ;.    subtotal +
284a0 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b  = szCell[i] + 2;
284b0 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61  .    if( subtota
284c0 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20  l > usableSpace 
284d0 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b  ){.      szNew[k
284e0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73  ] = subtotal - s
284f0 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
28500 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20  cntNew[k] = i;. 
28510 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
28520 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  a ){ i--; }.    
28530 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a    subtotal = 0;.
28540 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d        k++;.    }
28550 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
28560 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
28570 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
28580 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
28590 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
285a0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
285b0 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
285c0 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
285d0 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
285e0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
285f0 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
28600 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
28610 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
28620 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
28630 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
28640 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
28650 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
28660 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
28670 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
28680 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
28690 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
286a0 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
286b0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
286c0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
286d0 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
286e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
286f0 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
28700 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
28710 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
28720 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
28730 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
28740 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
28750 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
28760 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
28770 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
28780 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
28790 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
287a0 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
287b0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
287c0 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
287d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
287e0 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
287f0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
28800 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
28810 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
28820 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
28830 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
28840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28850 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
28860 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
28870 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
28880 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
28890 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
288a0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
288b0 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
288c0 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
288d0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
288e0 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
288f0 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
28900 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
28910 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
28920 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
28930 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
28940 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52  zRight==0 || szR
28950 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32  ight+szCell[d]+2
28960 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c  <=szLeft-(szCell
28970 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20  [r]+2) ){.      
28980 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
28990 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
289a0 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
289b0 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
289c0 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
289d0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
289e0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
289f0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
28a00 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
28a10 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
28a20 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
28a30 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
28a40 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
28a50 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
28a60 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
28a70 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65  0])>0) or we are
28a80 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74   the.  ** a virt
28a90 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
28aa0 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
28ab0 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
28ac0 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
28ad0 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
28ae0 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
28af0 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
28b00 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
28b10 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
28b20 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
28b30 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
28b40 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
28b50 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
28b60 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
28b70 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
28b80 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
28b90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28ba0 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
28bb0 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70  .  pageFlags = p
28bc0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  Page->aData[0];.
28bd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
28be0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
28bf0 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
28c00 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
28c10 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
28c20 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
28c30 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
28c40 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  pgnoOld[i];.    
28c50 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
28c60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28c70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
28c80 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
28c90 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
28ca0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
28cb0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
28cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28cd0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
28ce0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
28cf0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
28d00 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
28d10 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d  w[i], pgnoNew[i-
28d20 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  1], 0);.      if
28d30 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
28d40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
28d50 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
28d60 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
28d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28d80 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
28d90 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
28da0 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
28db0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
28dc0 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
28dd0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
28de0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
28df0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
28e00 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
28e10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28e20 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
28e30 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
28e40 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
28e50 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
28e60 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
28e70 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
28e80 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
28e90 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
28ea0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
28eb0 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
28ec0 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
28ed0 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
28ee0 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
28ef0 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
28f00 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
28f10 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
28f20 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
28f30 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
28f40 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
28f50 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
28f60 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
28f70 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
28f80 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
28f90 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
28fa0 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
28fb0 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
28fc0 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
28fd0 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
28fe0 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
28ff0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
29000 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
29010 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
29020 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
29030 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
29040 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
29050 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
29060 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
29070 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
29080 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
29090 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
290a0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
290b0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
290c0 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
290d0 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c   if( pgnoNew[j]<
290e0 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
290f0 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
29100 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
29110 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20   = pgnoNew[j];. 
29120 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29130 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
29140 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20       int t;.    
29150 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20    MemPage *pT;. 
29160 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77       t = pgnoNew
29170 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20  [i];.      pT = 
29180 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  apNew[i];.      
29190 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e  pgnoNew[i] = pgn
291a0 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  oNew[minI];.    
291b0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
291c0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
291d0 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20  pgnoNew[minI] = 
291e0 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  t;.      apNew[m
291f0 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
29200 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
29210 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
29220 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25  %d %d  new: %d(%
29230 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
29240 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
29250 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30  ",.    pgnoOld[0
29260 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  ], .    nOld>=2 
29270 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30  ? pgnoOld[1] : 0
29280 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
29290 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a  pgnoOld[2] : 0,.
292a0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20      pgnoNew[0], 
292b0 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
292c0 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=2 ? pgnoNew[
292d0 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  1] : 0, nNew>=2 
292e0 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
292f0 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67      nNew>=3 ? pg
29300 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e  noNew[2] : 0, nN
29310 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
29320 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
29330 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a  4 ? pgnoNew[3] :
29340 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a   0, nNew>=4 ? sz
29350 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20  New[3] : 0,.    
29360 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65  nNew>=5 ? pgnoNe
29370 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[4] : 0, nNew>=
29380 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
29390 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  ));..  /*.  ** E
293a0 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
293b0 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
293c0 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
293d0 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
293e0 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
293f0 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
29400 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
29410 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
29420 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
29430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
29440 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
29450 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
29460 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
29470 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
29480 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
29490 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
294a0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f  sert( pNew->pgno
294b0 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a  ==pgnoNew[i] );.
294c0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
294d0 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
294e0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
294f0 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
29500 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
29510 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
29520 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
29530 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
29540 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
29550 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
29560 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
29570 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  w==0 );..    /* 
29580 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
29590 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
295a0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
295b0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
295c0 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70  es.    ** that p
295d0 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c  oint to the sibl
295e0 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72  ings that were r
295f0 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65  earranged. These
29600 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20   can be: left.  
29610 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66    ** children of
29620 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68   cells, the righ
29630 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70  t-child of the p
29640 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77  age, or overflow
29650 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f   pages.    ** po
29660 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c  inted to by cell
29670 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
29680 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
29690 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b  {.      for(k=j;
296a0 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b   k<cntNew[i]; k+
296b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
296c0 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( k<nMaxCells 
296d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
296e0 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c  From[k]==0xFF ||
296f0 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d   apCopy[aFrom[k]
29700 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  ]->pgno!=pNew->p
29710 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gno ){.         
29720 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
29730 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a  vfl(pNew, k-j);.
29740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
29760 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
29770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29780 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
29790 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43  Bt, get4byte(apC
297a0 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f  ell[k]), PTRMAP_
297b0 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e  BTREE, pNew->pgn
297c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
297d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
297e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
297f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
29800 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
29810 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29830 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e     }..    j = cn
29840 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a  tNew[i];..    /*
29850 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
29860 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
29870 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65  bove was not the
29880 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
29890 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65  ing,.    ** inse
298a0 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  rt a divider cel
298b0 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  l into the paren
298c0 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
298d0 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20     if( i<nNew-1 
298e0 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  && j<nCell ){.  
298f0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
29900 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
29910 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
29920 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
29930 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
29940 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
29950 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
29960 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
29970 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
29980 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
29990 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20  e2[iSpace2];.   
299a0 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65     if( !pNew->le
299b0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  af ){.        me
299c0 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74  mcpy(&pNew->aDat
299d0 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b  a[8], pCell, 4);
299e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 41  .        if( ISA
299f0 55 54 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20  UTOVACUUM .     
29a00 20 20 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d      && (aFrom[j]
29a10 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79  ==0xFF || apCopy
29a20 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f  [aFrom[j]]->pgno
29a30 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20  !=pNew->pgno).  
29a40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29a50 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
29a60 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
29a70 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42  pCell), PTRMAP_B
29a80 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
29a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
29ac0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
29ad0 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  up;.          }.
29ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29af0 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
29b00 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
29b10 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
29b20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
29b30 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
29b40 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
29b50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
29b60 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
29b70 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
29b80 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
29b90 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
29ba0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
29bb0 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
29bc0 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
29bd0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
29be0 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
29bf0 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
29c00 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
29c10 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
29c20 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
29c30 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
29c40 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j--;.        sql
29c50 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
29c60 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
29c70 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
29c80 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70         pCell = p
29c90 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69  Temp;.        fi
29ca0 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74  llInCell(pParent
29cb0 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  , pCell, 0, info
29cc0 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
29cd0 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54  &sz);.        pT
29ce0 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
29cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
29d00 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
29d10 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73    /* Obscure cas
29d20 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64  e for non-leaf-d
29d30 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68  ata trees: If th
29d40 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20  e cell at pCell 
29d50 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  was.        ** p
29d60 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64  reviously stored
29d70 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   on a leaf node,
29d80 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65   and its reporte
29d90 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
29da0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
29db0 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
29dc0 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
29dd0 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
29de0 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65    ** (see sqlite
29df0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
29e00 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
29e10 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
29e20 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
29e30 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
29e40 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
29e50 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
29e60 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
29e70 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
29e80 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
29e90 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
29ea0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
29eb0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
29ec0 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
29ed0 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
29ee0 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
29ef0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
29f00 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
29f10 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
29f20 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
29f30 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
29f40 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
29f50 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
29f60 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
29f70 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
29f80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
29f90 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
29fa0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29fb0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
29fc0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
29fd0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
29fe0 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
29ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a000 7d 0a 20 20 20 20 20 20 69 53 70 61 63 65 32 20  }.      iSpace2 
2a010 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
2a020 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
2a030 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
2a040 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
2a050 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  2<=pBt->pageSize
2a060 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   );.      rc = i
2a070 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
2a080 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
2a090 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a   sz, pTemp, 4);.
2a0a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a0b0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
2a0c0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2a0d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
2a0e0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2a0f0 70 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20  pParent,nxDiv), 
2a100 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  pNew->pgno);..  
2a110 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2a120 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2a130 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e   database, and n
2a140 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  ot a leaf-data t
2a150 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ree,.      ** th
2a160 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  en update the po
2a170 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61  inter map with a
2a180 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
2a190 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
2a1a0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
2a1b0 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74  cell just insert
2a1c0 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66  ed points to (if
2a1d0 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
2a1e0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
2a1f0 56 41 43 55 55 4d 20 26 26 20 21 6c 65 61 66 44  VACUUM && !leafD
2a200 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
2a210 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2a220 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2a230 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a250 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2a260 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2a270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a280 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  }.      j++;.   
2a290 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
2a2a0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
2a2b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2a2c0 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
2a2d0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
2a2e0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2a2f0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
2a300 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2a310 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
2a320 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2a330 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  rent->pgno);.   
2a340 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a360 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2a370 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
2a380 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
2a390 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
2a3a0 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
2a3b0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
2a3c0 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
2a3d0 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
2a3e0 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
2a3f0 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
2a400 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
2a410 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
2a420 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
2a430 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
2a440 2c 20 34 29 3b 0a 20 20 20 20 69 66 28 20 49 53  , 4);.    if( IS
2a450 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2a460 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2a470 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
2a480 28 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d 41 50  (zChild), PTRMAP
2a490 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e  _BTREE, apNew[nN
2a4a0 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20  ew-1]->pgno);.  
2a4b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a4d0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2a4e0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20  eanup;.      }. 
2a4f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
2a500 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  xDiv==pParent->n
2a510 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f  Cell+pParent->nO
2a520 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f  verflow ){.    /
2a530 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
2a540 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68  ling is the righ
2a550 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  t-most child of 
2a560 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70  pParent */.    p
2a570 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
2a580 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2a590 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2a5a0 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
2a5b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2a5c0 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
2a5d0 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20  ing is the left 
2a5e0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72  child of the fir
2a5f0 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72  st entry in pPar
2a600 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  ent.    ** past 
2a610 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64  the right-most d
2a620 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a  ivider entry */.
2a630 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2a640 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2a650 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70  arent, nxDiv), p
2a660 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
2a670 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2a680 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65  Reparent childre
2a690 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a  n of all cells..
2a6a0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
2a6b0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
2a6c0 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
2a6d0 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b  hildPages(apNew[
2a6e0 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  i], 0);.    if( 
2a6f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a700 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2a710 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  anup;.  }.  rc =
2a720 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
2a730 67 65 73 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  ges(pParent, 0);
2a740 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2a750 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
2a760 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20  nce_cleanup;..  
2a770 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20  /*.  ** Balance 
2a780 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2a790 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
2a7a0 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50  current page (pP
2a7b0 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  age) might.  ** 
2a7c0 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
2a7d0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
2a7e0 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c  so it might no l
2a7f0 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c  onger be initial
2a800 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74  ized..  ** But t
2a810 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
2a820 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
2a830 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
2a840 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2a850 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 73  t->isInit );.  s
2a860 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
2a870 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70 43  e(apCell);.  apC
2a880 65 6c 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  ell = 0;.  rc = 
2a890 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
2a8a0 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a   0);.  .  /*.  *
2a8b0 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
2a8c0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
2a8d0 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
2a8e0 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  :.  sqlite3PageF
2a8f0 72 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20  ree(aSpace2);.  
2a900 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
2a910 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f  ee(apCell);.  fo
2a920 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
2a930 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
2a940 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
2a950 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2a960 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
2a970 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e   releasePage(apN
2a980 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  ew[i]);.  }.  re
2a990 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
2a9a0 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41  t);.  TRACE(("BA
2a9b0 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20  LANCE: finished 
2a9c0 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20  with %d: old=%d 
2a9d0 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c  new=%d cells=%d\
2a9e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50  n",.          pP
2a9f0 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c  age->pgno, nOld,
2aa00 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
2aa10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aa20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2aa30 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
2aa40 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2aa50 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74  f a btree when t
2aa60 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2aa70 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
2aa80 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  s.  This is an o
2aa90 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61  pportunity to ma
2aaa0 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73  ke the tree.** s
2aab0 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20  hallower by one 
2aac0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
2aad0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61   int balance_sha
2aae0 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a  llower(MemPage *
2aaf0 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
2ab00 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20  e *pChild;      
2ab10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
2ab20 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  ly child page of
2ab30 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f   pPage */.  Pgno
2ab40 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
2ab50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2ab60 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69   number for pChi
2ab70 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ld */.  int rc =
2ab80 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2ab90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2aba0 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  ode from subproc
2abb0 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68  edures */.  BtSh
2abc0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2abe0 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74  he main BTree st
2abf0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
2ac00 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20   mxCellPerPage; 
2ac10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2ac20 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
2ac30 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f  ells per page */
2ac40 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f  /* All cells fro
2ac70 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  m pages being ba
2ac80 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2ac90 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2aca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2acb0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2acc0 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lls */..  assert
2acd0 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
2ace0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2acf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2ad00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2ad10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ad20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2ad30 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ex) );.  pBt = p
2ad40 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43  Page->pBt;.  mxC
2ad50 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f  ellPerPage = MX_
2ad60 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43  CELL(pBt);.  apC
2ad70 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ell = sqlite3Mal
2ad80 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61  loc( mxCellPerPa
2ad90 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b  ge*(sizeof(u8*)+
2ada0 73 69 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a  sizeof(u16)) );.
2adb0 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
2adc0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2add0 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20  NOMEM;.  szCell 
2ade0 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
2adf0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a  mxCellPerPage];.
2ae00 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2ae10 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  f ){.    /* The 
2ae20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
2ae30 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20  ely empty */.   
2ae40 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2ae50 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64  : empty table %d
2ae60 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2ae70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2ae80 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
2ae90 65 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 68  e is empty but h
2aea0 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54  as one child.  T
2aeb0 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20  ransfer the.    
2aec0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
2aed0 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69  rom that one chi
2aee0 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74  ld into the root
2aef0 20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 20   page if it .   
2af00 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54   ** will fit.  T
2af10 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20  his reduces the 
2af20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65  depth of the tre
2af30 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  e by one..    **
2af40 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72  .    ** If the r
2af50 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65  oot page is page
2af60 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20   1, it has less 
2af70 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
2af80 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20  than.    ** its 
2af90 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68  child (due to th
2afa0 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65  e 100 byte heade
2afb0 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  r that occurs at
2afc0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
2afd0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74     ** of the dat
2afe0 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69  abase fle), so i
2aff0 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  t might not be a
2b000 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ble to hold all 
2b010 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69  of the .    ** i
2b020 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65  nformation curre
2b030 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69  ntly contained i
2b040 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66  n the child.  If
2b050 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20   this is the .  
2b060 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20    ** case, then 
2b070 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72  do not do the tr
2b080 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70  ansfer.  Leave p
2b090 61 67 65 20 31 20 65 6d 70 74 79 20 65 78 63 65  age 1 empty exce
2b0a0 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  pt.    ** for th
2b0b0 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
2b0c0 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  to the child pag
2b0d0 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61  e.  The child pa
2b0e0 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a  ge becomes.    *
2b0f0 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  * the virtual ro
2b100 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a  ot of the tree..
2b110 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43      */.    pgnoC
2b120 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2b130 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2b140 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2b150 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2b160 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20  pgnoChild>0 );. 
2b170 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
2b180 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63  hild<=pagerPagec
2b190 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d  ount(pPage->pBt-
2b1a0 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  >pPager) );.    
2b1b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2b1c0 65 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e  eGetPage(pPage->
2b1d0 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
2b1e0 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20  &pChild, 0);.   
2b1f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2b200 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2b210 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ce;.    if( pPag
2b220 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  e->pgno==1 ){.  
2b230 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b240 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43  BtreeInitPage(pC
2b250 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20  hild, pPage);.  
2b260 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2b270 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
2b280 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73  lance;.      ass
2b290 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  ert( pChild->nOv
2b2a0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20  erflow==0 );.   
2b2b0 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
2b2c0 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20  Free>=100 ){.   
2b2d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
2b2e0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
2b2f0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
2b300 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74  ot page, so do t
2b310 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  he.        ** co
2b320 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  py */.        in
2b330 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72  t i;.        zer
2b340 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
2b350 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  ild->aData[0]);.
2b360 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2b370 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
2b380 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2b390 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69    apCell[i] = fi
2b3a0 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29  ndCell(pChild,i)
2b3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  ;.          szCe
2b3c0 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ll[i] = cellSize
2b3d0 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65  Ptr(pChild, apCe
2b3e0 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ll[i]);.        
2b3f0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62  }.        assemb
2b400 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  lePage(pPage, pC
2b410 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43  hild->nCell, apC
2b420 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20  ell, szCell);.  
2b430 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
2b440 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
2b450 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20  of the child to 
2b460 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  the parent. */. 
2b470 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2b480 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2b490 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2b4a0 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
2b4b0 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64  get4byte(&pChild
2b4c0 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e  ->aData[pChild->
2b4d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2b4e0 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65          freePage
2b4f0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2b500 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2b510 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e  E: child %d tran
2b520 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e  sfer to page 1\n
2b530 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
2b540 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2b550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2b560 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e  hild has more in
2b570 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
2b580 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
2b590 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  oot..        ** 
2b5a0 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65  The tree is alre
2b5b0 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44  ady balanced.  D
2b5c0 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20  o nothing. */.  
2b5d0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2b5e0 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
2b5f0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
2b600 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
2b610 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
2b620 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2b630 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2b640 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d  ->aData, pChild-
2b650 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70  >aData, pPage->p
2b660 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
2b670 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73  .      pPage->is
2b680 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Init = 0;.      
2b690 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
2b6a0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
2b6b0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2b6c0 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  age(pPage, 0);. 
2b6d0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2b6e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2b6f0 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68      freePage(pCh
2b700 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43  ild);.      TRAC
2b710 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61  E(("BALANCE: tra
2b720 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69  nsfer child %d i
2b730 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a  nto root %d\n",.
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2b750 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67  hild->pgno, pPag
2b760 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  e->pgno));.    }
2b770 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
2b780 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61  ntChildPages(pPa
2b790 67 65 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  ge, 1);.    asse
2b7a0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2b7b0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 69  flow==0 );.    i
2b7c0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2b7d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
2b7e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2b7f0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
2b800 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63  ++){ .        rc
2b810 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
2b820 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2b830 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b850 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c     goto end_shal
2b860 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2b870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2b880 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
2b890 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2b8a0 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  }.end_shallow_ba
2b8b0 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33  lance:.  sqlite3
2b8c0 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  _free(apCell);. 
2b8d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2b8e0 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70  /*.** The root p
2b8f0 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a  age is overfull.
2b900 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
2b910 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20  happens, Create 
2b920 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2b930 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a   and copy the.**
2b940 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2b950 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63   root into the c
2b960 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65  hild.  Then make
2b970 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2b980 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  e an empty page 
2b990 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20  with rightChild 
2b9a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2b9b0 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20  new.** child.   
2b9c0 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61  Finally, call ba
2b9d0 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29  lance_internal()
2b9e0 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c   on the new chil
2b9f0 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74  d.** to cause it
2ba00 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74   to split..*/.st
2ba10 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2ba20 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
2ba30 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  *pPage){.  int r
2ba40 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  c;             /
2ba50 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66  * Return value f
2ba60 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
2ba70 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
2ba80 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f  pChild;    /* Po
2ba90 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
2baa0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
2bab0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
2bac0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2bad0 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
2bae0 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
2baf0 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2bb00 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
2bb10 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
2bb20 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Size;     /* Tot
2bb30 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f  al usable size o
2bb40 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  f a page */.  u8
2bb50 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2bb60 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2bb70 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2bb80 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20  */.  u8 *cdata; 
2bb90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2bba0 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ent of the child
2bbb0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68   page */.  int h
2bbc0 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
2bbd0 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65  * Offset to page
2bbe0 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e   header in paren
2bbf0 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  t */.  int cbrk;
2bc00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2bc10 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20  fset to content 
2bc20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  of first cell in
2bc30 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73   parent */..  as
2bc40 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61  sert( pPage->pPa
2bc50 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  rent==0 );.  ass
2bc60 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2bc70 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74  rflow>0 );.  pBt
2bc80 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2bc90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2bca0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2bcb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2bcc0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2bcd0 61 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64  age(pBt, &pChild
2bce0 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50  , &pgnoChild, pP
2bcf0 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  age->pgno, 0);. 
2bd00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2bd10 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
2bd20 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2bd30 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
2bd40 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61  DbPage) );.  usa
2bd50 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
2bd60 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
2bd70 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2bd80 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2bd90 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62  >hdrOffset;.  cb
2bda0 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
2bdb0 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63  ata[hdr+5]);.  c
2bdc0 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61  data = pChild->a
2bdd0 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63  Data;.  memcpy(c
2bde0 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d  data, &data[hdr]
2bdf0 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  , pPage->cellOff
2be00 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
2be10 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70  ll-hdr);.  memcp
2be20 79 28 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20  y(&cdata[cbrk], 
2be30 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
2be40 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 20  bleSize-cbrk);. 
2be50 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 69 73 49   if( pChild->isI
2be60 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
2be70 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72  ITE_CORRUPT;.  r
2be80 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2be90 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  InitPage(pChild,
2bea0 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   pPage);.  if( r
2beb0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
2bec0 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65  deeper_out;.  me
2bed0 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
2bee0 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  fl, pPage->aOvfl
2bef0 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  , pPage->nOverfl
2bf00 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  ow*sizeof(pPage-
2bf10 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70  >aOvfl[0]));.  p
2bf20 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
2bf30 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2bf40 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c  low;.  if( pChil
2bf50 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
2bf60 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65      pChild->nFre
2bf70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
2bf80 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65  ert( pChild->nCe
2bf90 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ll==pPage->nCell
2bfa0 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   );.  zeroPage(p
2bfb0 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Page, pChild->aD
2bfc0 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
2bfd0 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
2bfe0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2bff0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2c000 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ], pgnoChild);. 
2c010 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2c020 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69  : copy root %d i
2c030 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  nto %d\n", pPage
2c040 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e  ->pgno, pChild->
2c050 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 49 53  pgno));.  if( IS
2c060 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2c070 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20    int i;.    rc 
2c080 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
2c090 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50   pChild->pgno, P
2c0a0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
2c0b0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ge->pgno);.    i
2c0c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2c0d0 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a  ancedeeper_out;.
2c0e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2c0f0 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
2c100 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
2c110 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68  trmapPutOvfl(pCh
2c120 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  ild, i);.      i
2c130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c140 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2c150 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
2c160 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
2c170 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72  }.    rc = repar
2c180 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 43  entChildPages(pC
2c190 68 69 6c 64 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  hild, 1);.  }.  
2c1a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c1b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61  K ){.    rc = ba
2c1c0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43  lance_nonroot(pC
2c1d0 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 62 61 6c 61  hild);.  }..bala
2c1e0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20  ncedeeper_out:. 
2c1f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
2c200 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ild);.  return r
2c210 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69  c;.}../*.** Deci
2c220 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70  de if the page p
2c230 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  Page needs to be
2c240 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62   balanced.  If b
2c250 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72  alancing is.** r
2c260 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68  equired, call th
2c270 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
2c280 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e  lancing routine.
2c290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2c2a0 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a  alance(MemPage *
2c2b0 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72  pPage, int inser
2c2c0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2c2d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2c2e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c2f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2c300 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
2c310 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  f( pPage->pParen
2c320 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
2c330 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c340 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2c350 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
2c360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
2c370 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2c380 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
2c390 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
2c3a0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2c3b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c3c0 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
2c3d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2c3e0 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  = balance_shallo
2c3f0 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20  wer(pPage);.    
2c400 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
2c410 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
2c420 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20  low>0 || .      
2c430 20 20 28 21 69 6e 73 65 72 74 20 26 26 20 70 50    (!insert && pP
2c440 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65  age->nFree>pPage
2c450 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2c460 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20  e*2/3) ){.      
2c470 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
2c480 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20  root(pPage);.   
2c490 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2c4a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2c4b0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
2c4c0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61   all cursors tha
2c4d0 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65  t point to table
2c4e0 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66   pgnoRoot..** If
2c4f0 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75   any of those cu
2c500 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65  rsors were opene
2c510 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
2c520 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a   in a different.
2c530 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
2c540 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61  ection (a databa
2c550 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  se connection th
2c560 61 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61  at shares the pa
2c570 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74  ger.** cache wit
2c580 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  h the current co
2c590 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68  nnection) and th
2c5a0 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  at other connect
2c5b0 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69  ion .** is not i
2c5c0 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  n the ReadUncomm
2c5d0 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68  mitted state, th
2c5e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2c5f0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
2c600 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a  TE_LOCKED..**.**
2c610 20 41 73 20 77 65 6c 6c 20 61 73 20 63 75 72 73   As well as curs
2c620 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ors with wrFlag=
2c630 3d 30 2c 20 63 75 72 73 6f 72 73 20 77 69 74 68  =0, cursors with
2c640 20 77 72 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a   wrFlag==1 and .
2c650 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  ** isIncrblobHan
2c660 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20  dle==1 are also 
2c670 63 6f 6e 73 69 64 65 72 65 64 20 27 72 65 61 64  considered 'read
2c680 27 20 63 75 72 73 6f 72 73 2e 20 49 6e 63 72 65  ' cursors. Incre
2c690 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20  mental .** blob 
2c6a0 63 75 72 73 6f 72 73 20 61 72 65 20 75 73 65 64  cursors are used
2c6b0 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
2c6c0 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a  g and writing..*
2c6d0 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f  *.** When pgnoRo
2c6e0 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ot is the root p
2c6f0 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79  age of an intkey
2c700 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e   table, this fun
2c710 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a  ction is also.**
2c720 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2c730 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e   invalidating in
2c740 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
2c750 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20  ursors when the 
2c760 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20  table row.** on 
2c770 77 68 69 63 68 20 74 68 65 79 20 61 72 65 20 6f  which they are o
2c780 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64  pened is deleted
2c790 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75   or modified. Cu
2c7a0 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
2c7b0 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  dated.** accordi
2c7c0 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ng to the follow
2c7d0 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ing rules:.**.**
2c7e0 20 20 20 31 29 20 57 68 65 6e 20 42 74 72 65 65     1) When Btree
2c7f0 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69 73 20  ClearTable() is 
2c800 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
2c810 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  tely delete the 
2c820 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20  contents.**     
2c830 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74 61 62   of a B-Tree tab
2c840 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20  le, pExclude is 
2c850 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20  set to zero and 
2c860 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69  parameter iRow i
2c870 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74  s .**      set t
2c880 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  o non-zero. In t
2c890 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63  his case all inc
2c8a0 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
2c8b0 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20  rsors open.**   
2c8c0 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20     on the table 
2c8d0 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f  rooted at pgnoRo
2c8e0 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  ot are invalidat
2c8f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57  ed..**.**   2) W
2c900 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28  hen BtreeInsert(
2c910 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  ), BtreeDelete()
2c920 20 6f 72 20 42 74 72 65 65 50 75 74 44 61 74 61   or BtreePutData
2c930 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
2c940 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20  .**      modify 
2c950 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20  a table row via 
2c960 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
2c970 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65  , pExclude is se
2c980 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20  t to the .**    
2c990 20 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 75    write cursor u
2c9a0 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f  sed to do the mo
2c9b0 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70  dification and p
2c9c0 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73  arameter iRow is
2c9d0 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20   set.**      to 
2c9e0 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20  the integer row 
2c9f0 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65  id of the B-Tree
2ca00 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64   entry being mod
2ca10 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a  ified. Unless.**
2ca20 20 20 20 20 20 20 70 45 78 63 6c 75 64 65 20 69        pExclude i
2ca30 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72  s itself an incr
2ca40 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
2ca50 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e  sor, then all in
2ca60 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20  cremental.**    
2ca70 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f    blob cursors o
2ca80 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20  pen on row iRow 
2ca90 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 72  of the B-Tree ar
2caa0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
2cab0 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74  *.**   3) If bot
2cac0 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69  h pExclude and i
2cad0 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a  Row are set to z
2cae0 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e  ero, no incremen
2caf0 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20  tal blob .**    
2cb00 20 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e    cursors are in
2cb10 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74  validated..*/.st
2cb20 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
2cb30 61 64 4c 6f 63 6b 73 28 0a 20 20 42 74 72 65 65  adLocks(.  Btree
2cb40 20 2a 70 42 74 72 65 65 2c 20 0a 20 20 50 67 6e   *pBtree, .  Pgn
2cb50 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42  o pgnoRoot, .  B
2cb60 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64  tCursor *pExclud
2cb70 65 2c 0a 20 20 69 36 34 20 69 52 6f 77 0a 29 7b  e,.  i64 iRow.){
2cb80 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
2cb90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2cba0 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  = pBtree->pBt;. 
2cbb0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2cbc0 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Btree->db;.  ass
2cbd0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
2cbe0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72  eHoldsMutex(pBtr
2cbf0 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ee) );.  for(p=p
2cc00 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
2cc10 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
2cc20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65   if( p==pExclude
2cc30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2cc40 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
2cc50 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e  !=pgnoRoot ) con
2cc60 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
2cc70 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
2cc80 4c 4f 42 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  LOB.    if( p->i
2cc90 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
2cca0 26 26 20 28 20 0a 20 20 20 20 20 20 20 20 20 28  && ( .         (
2ccb0 21 70 45 78 63 6c 75 64 65 20 26 26 20 69 52 6f  !pExclude && iRo
2ccc0 77 29 0a 20 20 20 20 20 20 7c 7c 20 28 70 45 78  w).      || (pEx
2ccd0 63 6c 75 64 65 20 26 26 20 21 70 45 78 63 6c 75  clude && !pExclu
2cce0 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  de->isIncrblobHa
2ccf0 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e  ndle && p->info.
2cd00 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
2cd10 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74  )){.      p->eSt
2cd20 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2cd30 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ALID;.    }.#end
2cd40 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53  if.    if( p->eS
2cd50 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2cd60 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ID ) continue;. 
2cd70 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67     if( p->wrFlag
2cd80 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ==0 .#ifndef SQL
2cd90 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2cda0 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49  B.     || p->isI
2cdb0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65  ncrblobHandle.#e
2cdc0 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  ndif.    ){.    
2cdd0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68    sqlite3 *dbOth
2cde0 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e  er = p->pBtree->
2cdf0 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  db;.      if( db
2ce00 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20  Other==0 ||.    
2ce10 20 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64       (dbOther!=d
2ce20 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66  b && (dbOther->f
2ce30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
2ce40 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d  adUncommitted)==
2ce50 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  0) ){.        re
2ce60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2ce70 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ED;.      }.    
2ce80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
2ce90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2cea0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
2ceb0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
2cec0 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20  BTree.  The key 
2ced0 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65  is given by (pKe
2cee0 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74  y,nKey).** and t
2cef0 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e  he data is given
2cf00 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61   by (pData,nData
2cf10 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69  ).  The cursor i
2cf20 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a  s used only to.*
2cf30 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61  * define what ta
2cf40 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73  ble the record s
2cf50 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
2cf60 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72  d into.  The cur
2cf70 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
2cf80 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
2cf90 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  dom location..**
2cfa0 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45  .** For an INTKE
2cfb0 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68  Y table, only th
2cfc0 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20  e nKey value of 
2cfd0 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e  the key is used.
2cfe0 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e    pKey is.** ign
2cff0 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52  ored.  For a ZER
2d000 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65  ODATA table, the
2d010 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61   pData and nData
2d020 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65   are both ignore
2d030 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2d040 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
2d050 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d070 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
2d080 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
2d090 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
2d0a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
2d0b0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
2d0c0 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
2d0d0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
2d0e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
2d0f0 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
2d100 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
2d110 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
2d120 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d140 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d150 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
2d160 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
2d170 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
2d180 69 61 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ias             
2d190 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2d1a0 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
2d1b0 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20   append */.){.  
2d1c0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f  int rc;.  int lo
2d1d0 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a  c;.  int szNew;.
2d1e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d1f0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
2d200 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
2d210 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2d220 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
2d230 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
2d240 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2d250 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
2d260 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d270 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2d280 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
2d290 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2d2a0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2d2b0 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2d2c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66   transaction bef
2d2d0 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73  ore doing an ins
2d2e0 65 72 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ert */.    rc = 
2d2f0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
2d300 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
2d310 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
2d320 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d330 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
2d340 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
2d350 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2d360 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2d370 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2d380 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70  /* Cursor not op
2d390 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a  en for writing *
2d3a0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63  /.  }.  if( chec
2d3b0 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d  kReadLocks(pCur-
2d3c0 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
2d3d0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e  gnoRoot, pCur, n
2d3e0 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Key) ){.    retu
2d3f0 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2d400 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70  ; /* The table p
2d410 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61  Cur points to ha
2d420 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  s a read lock */
2d430 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
2d440 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d450 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
2d460 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
2d470 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
2d480 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
2d490 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
2d4a0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
2d4b0 61 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43  able */.  clearC
2d4c0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2d4d0 75 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20  ur);.  if( .    
2d4e0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2d4f0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2d500 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2d510 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20  oot, pCur)) ||. 
2d520 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
2d530 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2d540 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65  Moveto(pCur, pKe
2d550 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  y, nKey, appendB
2d560 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b  ias, &loc)).  ){
2d570 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2d580 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2d590 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2d5a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2d5b0 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
2d5c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d5d0 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
2d5e0 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54  e->intKey );.  T
2d5f0 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74  RACE(("INSERT: t
2d600 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c  able=%d nkey=%ll
2d610 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d  d ndata=%d page=
2d620 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
2d630 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2d640 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c  ot, nKey, nData,
2d650 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20   pPage->pgno,.  
2d660 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f          loc==0 ?
2d670 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22   "overwrite" : "
2d680 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20  new entry"));.  
2d690 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2d6a0 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63  sInit );.  alloc
2d6b0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
2d6c0 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70  );.  newCell = p
2d6d0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
2d6e0 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20   if( newCell==0 
2d6f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2d700 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69  NOMEM;.  rc = fi
2d710 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20  llInCell(pPage, 
2d720 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e  newCell, pKey, n
2d730 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  Key, pData, nDat
2d740 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77  a, nZero, &szNew
2d750 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2d760 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2d770 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d   assert( szNew==
2d780 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2d790 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20  e, newCell) );. 
2d7a0 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d   assert( szNew<=
2d7b0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2d7c0 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d  ) );.  if( loc==
2d7d0 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49  0 && CURSOR_VALI
2d7e0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2d7f0 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
2d800 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2d810 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
2d820 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
2d830 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
2d840 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d850 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2d860 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2d870 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
2d880 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
2d890 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
2d8a0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2d8b0 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28  r->idx);.    if(
2d8c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2d8d0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
2d8e0 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
2d8f0 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
2d900 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
2d910 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
2d920 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
2d930 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
2d940 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2d950 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2d960 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ert;.    dropCel
2d970 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2d980 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65  dx, szOld);.  }e
2d990 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
2d9a0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2d9b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2d9c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
2d9d0 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20    pCur->idx++;. 
2d9e0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
2d9f0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
2da00 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
2da10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2da20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
2da30 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
2da40 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2da50 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65  e, pCur->idx, ne
2da60 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
2da70 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
2da80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2da90 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63  end_insert;.  rc
2daa0 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2dab0 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 1);.  if( rc==
2dac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dad0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2dae0 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
2daf0 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
2db00 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2db10 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
2db20 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
2db30 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
2db40 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2db50 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2db60 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2db70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2db80 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
2db90 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2dba0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2dbb0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73  ur->pPage;.  uns
2dbc0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2dbd0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  l;.  int rc;.  P
2dbe0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
2dbf0 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  0;.  Btree *p = 
2dc00 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
2dc10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2dc20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
2dc30 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2dc40 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2dc50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2dc60 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42  Init );.  if( pB
2dc70 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2dc80 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2dc90 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2dca0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2dcb0 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20   before doing a 
2dcc0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63  delete */.    rc
2dcd0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2dce0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2dcf0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2dd00 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2dd10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2dd20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2dd30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2dd40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2dd50 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2dd60 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2dd70 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78  .  if( pCur->idx
2dd80 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   >= pPage->nCell
2dd90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2dda0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
2ddb0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
2ddc0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ot pointing to a
2ddd0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2dde0 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c   if( !pCur->wrFl
2ddf0 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ag ){.    return
2de00 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20   SQLITE_PERM;   
2de10 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20  /* Did not open 
2de20 74 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20  this cursor for 
2de30 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  writing */.  }. 
2de40 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f   if( checkReadLo
2de50 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cks(pCur->pBtree
2de60 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2de70 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e  , pCur, pCur->in
2de80 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20  fo.nKey) ){.    
2de90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2dea0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2deb0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2dec0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2ded0 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  k */.  }..  /* R
2dee0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
2def0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2df00 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74  on (a no-op if t
2df10 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2df20 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52   in .  ** CURSOR
2df30 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
2df40 74 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65  te) and save the
2df50 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
2df60 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
2df70 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68  .  ** open on th
2df80 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68  e same table. Th
2df90 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  en call sqlite3P
2dfa0 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
2dfb0 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61  he page.  ** tha
2dfc0 74 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c  t the entry will
2dfd0 20 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   be deleted from
2dfe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
2dff0 20 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43    (rc = restoreC
2e000 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2e010 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2e020 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2e030 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2e040 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21  gnoRoot, pCur))!
2e050 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
2e060 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e070 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2e080 29 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  ))!=0.  ){.    r
2e090 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2e0a0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
2e0b0 65 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70  ell within its p
2e0c0 61 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43  age and leave pC
2e0d0 65 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ell pointing to 
2e0e0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54  the.  ** data. T
2e0f0 68 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63  he clearCell() c
2e100 61 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76  all frees any ov
2e110 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2e120 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2e130 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  .  ** cell. The 
2e140 63 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73  cell itself is s
2e150 74 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a  till intact..  *
2e160 2f 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  /.  pCell = find
2e170 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2e180 2d 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  ->idx);.  if( !p
2e190 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e1a0 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2e1b0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
2e1c0 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
2e1d0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2e1e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2e1f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e200 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
2e210 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a  >leaf ){.    /*.
2e220 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79      ** The entry
2e230 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2e240 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61   delete is not a
2e250 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64   leaf so if we d
2e260 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20  o not.    ** do 
2e270 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c  something we wil
2e280 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f  l leave a hole o
2e290 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61  n an internal pa
2e2a0 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61  ge..    ** We ha
2e2b0 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68  ve to fill the h
2e2c0 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e  ole by moving in
2e2d0 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c   a cell from a l
2e2e0 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  eaf.  The.    **
2e2f0 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72   next Cell after
2e300 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64   the one to be d
2e310 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e  eleted is guaran
2e320 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e  teed to exist an
2e330 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61  d.    ** to be a
2e340 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20   leaf so we can 
2e350 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
2e360 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66     BtCursor leaf
2e370 43 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Cur;.    unsigne
2e380 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20  d char *pNext;. 
2e390 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
2e3a0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2e3b0 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b  r *tempCell = 0;
2e3c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
2e3d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
2e3e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47     sqlite3BtreeG
2e3f0 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75  etTempCursor(pCu
2e400 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  r, &leafCur);.  
2e410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2e420 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
2e430 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
2e440 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e450 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2e460 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2e470 74 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  te(leafCur.pPage
2e480 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2e490 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2e4a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e4b0 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20   u16 szNext;.   
2e4c0 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
2e4d0 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
2e4e0 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d  te internal from
2e4f0 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d   %d replace from
2e500 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20   leaf %d\n",.   
2e510 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2e520 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2e530 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65  o, leafCur.pPage
2e540 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2e550 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
2e560 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
2e570 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2e580 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65  ell));.      pNe
2e590 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65  xt = findCell(le
2e5a0 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61  afCur.pPage, lea
2e5b0 66 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20  fCur.idx);.     
2e5c0 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69   szNext = cellSi
2e5d0 7a 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50  zePtr(leafCur.pP
2e5e0 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  age, pNext);.   
2e5f0 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
2e600 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a  LL_SIZE(pBt)>=sz
2e610 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20  Next+4 );.      
2e620 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
2e630 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65  e(pBt);.      te
2e640 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  mpCell = pBt->pT
2e650 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69  mpSpace;.      i
2e660 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
2e670 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2e680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2e690 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2e6a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e6b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73          rc = ins
2e6c0 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ertCell(pPage, p
2e6d0 43 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d  Cur->idx, pNext-
2e6e0 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d  4, szNext+4, tem
2e6f0 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  pCell, 0);.     
2e700 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
2e710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e720 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66        put4byte(f
2e730 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2e740 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2e750 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ), pgnoChild);. 
2e760 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
2e770 6e 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  nce(pPage, 0);. 
2e780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2e790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e7a0 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  {.        dropCe
2e7b0 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2e7c0 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73  , leafCur.idx, s
2e7d0 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zNext);.        
2e7e0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61  rc = balance(lea
2e7f0 66 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a  fCur.pPage, 0);.
2e800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e810 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65    sqlite3BtreeRe
2e820 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28  leaseTempCursor(
2e830 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c  &leafCur);.  }el
2e840 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22  se{.    TRACE(("
2e850 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2e860 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61   delete from lea
2e870 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2e880 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2e890 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2e8a0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2e8b0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65  e, pCur->idx, ce
2e8c0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2e8d0 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63   pCell));.    rc
2e8e0 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2e8f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
2e900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e910 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
2e920 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pCur);.  }.  ret
2e930 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e940 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54   Create a new BT
2e950 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74  ree table.  Writ
2e960 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20  e into *piTable 
2e970 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
2e980 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  er for the root 
2e990 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
2e9a0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
2e9b0 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73   type of type is
2e9c0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
2e9d0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2e9e0 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a  er.  Only the.**
2e9f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
2ea00 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63  s of flags are c
2ea10 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e  urrently in use.
2ea20 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66    Other values f
2ea30 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68  or.** flags migh
2ea40 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a  t not work:.**.*
2ea50 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b  *     BTREE_INTK
2ea60 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54  EY|BTREE_LEAFDAT
2ea70 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53  A     Used for S
2ea80 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72  QL tables with r
2ea90 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20  owid keys.**    
2eaa0 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20   BTREE_ZERODATA 
2eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eac0 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e   Used for SQL in
2ead0 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  dices.*/.static 
2eae0 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54  int btreeCreateT
2eaf0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2eb00 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74  nt *piTable, int
2eb10 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61   flags){.  BtSha
2eb20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2eb30 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  t;.  MemPage *pR
2eb40 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  oot;.  Pgno pgno
2eb50 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Root;.  int rc;.
2eb60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2eb70 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2eb80 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 42  x(p) );.  if( pB
2eb90 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2eba0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2ebb0 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2ebc0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2ebd0 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 63   first */.    rc
2ebe0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2ebf0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2ec00 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2ec10 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2ec20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ec30 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2ec40 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
2ec50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2ec60 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2ec70 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2ec80 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
2ec90 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 1, 0);.  if( r
2eca0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2ecb0 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  rc;.  }.#else.  
2ecc0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2ecd0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
2ece0 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
2ecf0 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
2ed00 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
2ed10 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2ed20 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
2ed30 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
2ed40 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
2ed50 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
2ed60 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74  Creating a new t
2ed70 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c  able may probabl
2ed80 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
2ed90 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   an existing dat
2eda0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20  abase.    ** to 
2edb0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
2edc0 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f  e new tables roo
2edd0 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20  t page. In case 
2ede0 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a  this page turns.
2edf0 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65      ** out to be
2ee00 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2ee10 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76  e, delete all ov
2ee20 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20  erflow page-map 
2ee30 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65  caches.    ** he
2ee40 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f  ld by open curso
2ee50 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
2ee60 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
2ee70 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
2ee80 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
2ee90 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
2eea0 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
2eeb0 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
2eec0 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
2eed0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
2eee0 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
2eef0 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
2ef00 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
2ef10 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
2ef20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
2ef30 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
2ef40 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
2ef50 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
2ef60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ef70 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
2ef80 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
2ef90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2efa0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2efb0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2efc0 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20  gnoRoot++;..    
2efd0 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d  /* The new root-
2efe0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
2eff0 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70  allocated on a p
2f000 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2f010 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50   or the.    ** P
2f020 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65  ENDING_BYTE page
2f030 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
2f040 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  le( pgnoRoot==PT
2f050 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
2f060 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
2f070 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
2f080 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2f090 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
2f0a0 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
2f0b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
2f0c0 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
2f0d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
2f0e0 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
2f0f0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
2f100 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
2f110 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
2f120 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
2f130 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
2f140 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
2f150 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
2f160 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
2f170 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
2f180 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
2f190 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2f1a0 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
2f1b0 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
2f1c0 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
2f1d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f1e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f1f0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
2f200 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
2f210 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
2f220 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  /* pgnoRoot is t
2f230 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  he page that wil
2f240 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
2f250 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20  e root-page of. 
2f260 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
2f270 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20  table (assuming 
2f280 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74  an error did not
2f290 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20   occur). But we 
2f2a0 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  were.      ** al
2f2b0 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65  located pgnoMove
2f2c0 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69  . If required (i
2f2d0 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f  .e. if it was no
2f2e0 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  t allocated.    
2f2f0 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e    ** by extendin
2f300 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65  g the file), the
2f310 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74   current page at
2f320 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f   position pgnoMo
2f330 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  ve.      ** is a
2f340 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64  lready journaled
2f350 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2f360 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
2f370 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
2f380 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2f390 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a  ge(pPageMove);..
2f3a0 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68        /* Move th
2f3b0 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
2f3c0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20   at pgnoRoot to 
2f3d0 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20  pgnoMove. */.   
2f3e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2f3f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2f400 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
2f410 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
2f420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f430 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f440 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2f450 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
2f460 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
2f470 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
2f480 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2f490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2f4a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
2f4b0 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
2f4c0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2f4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2f4e0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2f4f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f500 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2f510 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
2f520 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
2f530 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f540 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
2f550 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
2f560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f570 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
2f580 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
2f590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2f5b0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2f5c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f5d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2f5e0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
2f5f0 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
2f600 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
2f610 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
2f620 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f630 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
2f640 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
2f650 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
2f660 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2f670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f680 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2f6a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2f6b0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
2f6c0 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
2f6d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2f6e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f6f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2f710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f720 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
2f730 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2f740 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f750 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2f760 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2f770 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f780 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2f790 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
2f7a0 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
2f7b0 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
2f7c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f7d0 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
2f7e0 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
2f7f0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
2f800 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
2f810 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
2f820 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
2f830 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
2f840 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
2f850 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2f860 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f870 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2f880 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2f890 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
2f8a0 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
2f8b0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
2f8c0 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2f8d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f8e0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
2f8f0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
2f900 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2f910 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
2f920 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
2f930 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2f940 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
2f950 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2f960 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2f970 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
2f980 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
2f990 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
2f9a0 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
2f9b0 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
2f9c0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
2f9d0 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
2f9e0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
2f9f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
2fa00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2fa10 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2fa20 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2fa30 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2fa40 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
2fa50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
2fa60 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
2fa70 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
2fa80 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
2fa90 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , piTable, flags
2faa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
2fab0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
2fac0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fad0 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
2fae0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
2faf0 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
2fb00 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
2fb10 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
2fb20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
2fb30 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
2fb40 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
2fb50 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
2fb60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
2fb70 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
2fb80 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
2fb90 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
2fba0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2fbb0 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
2fbc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2fbd0 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65  ent,     /* Pare
2fbe0 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66  nt page.  NULL f
2fbf0 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20  or the root */. 
2fc00 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
2fc10 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g      /* Deallo
2fc20 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
2fc30 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
2fc40 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
2fc50 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
2fc60 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
2fc70 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
2fc80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2fc90 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2fca0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
2fcb0 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
2fcc0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
2fcd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fce0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2fcf0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41    }..  rc = getA
2fd00 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2fd10 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70 50  pgno, &pPage, pP
2fd20 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  arent);.  if( rc
2fd30 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2fd40 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2fd50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
2fd60 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
2fd70 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2fd80 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
2fd90 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2fda0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2fdb0 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
2fdc0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
2fdd0 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65  te(pCell), pPage
2fde0 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20  ->pParent, 1);. 
2fdf0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2fe00 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2fe10 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2fe20 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
2fe30 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2fe40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2fe50 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2fe60 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2fe70 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2fe80 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  f ){.    rc = cl
2fe90 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2fea0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
2feb0 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  Page->aData[8]),
2fec0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c   pPage->pParent,
2fed0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   1);.    if( rc 
2fee0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2fef0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2ff00 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65  }.  if( freePage
2ff10 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  Flag ){.    rc =
2ff20 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2ff30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72  ;.  }else if( (r
2ff40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ff50 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2ff60 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20  Page))==0 ){.   
2ff70 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2ff80 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2ff90 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
2ffa0 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65  }..cleardatabase
2ffb0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65  page_out:.  rele
2ffc0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2ffd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ffe0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c  /*.** Delete all
2fff0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
30000 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  m a single table
30010 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30020 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20  .  iTable is.** 
30030 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
30040 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  of the root of t
30050 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72  he table.  After
30060 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
30070 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f  turns,.** the ro
30080 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79  ot page is empty
30090 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73  , but still exis
300a0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ts..**.** This r
300b0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c  outine will fail
300c0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43   with SQLITE_LOC
300d0 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65  KED if there are
300e0 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61   any open.** rea
300f0 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  d cursors on the
30100 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72   table.  Open wr
30110 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
30120 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
30130 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
30140 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
30150 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
30160 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
30170 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63  Table){.  int rc
30180 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
30190 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
301a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
301b0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
301c0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  p->db;.  if( p->
301d0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
301e0 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  RITE ){.    rc =
301f0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
30200 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
30210 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
30220 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63  .  }else if( (rc
30230 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b   = checkReadLock
30240 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20  s(p, iTable, 0, 
30250 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  1))!=SQLITE_OK )
30260 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67  {.    /* nothing
30270 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73   to do */.  }els
30280 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21  e if( SQLITE_OK!
30290 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
302a0 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c  rsors(pBt, iTabl
302b0 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a  e, 0)) ){.    /*
302c0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a   nothing to do *
302d0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  /.  }else{.    r
302e0 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
302f0 65 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  ePage(pBt, (Pgno
30300 29 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a  )iTable, 0, 0);.
30310 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
30320 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
30330 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30340 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f  * Erase all info
30350 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62  rmation in a tab
30360 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  le and add the r
30370 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
30380 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c   to.** the freel
30390 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ist.  Except, th
303a0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72  e root of the pr
303b0 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74  inciple table (t
303c0 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67  he one on.** pag
303d0 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64  e 1) is never ad
303e0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
303f0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ist..**.** This 
30400 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69  routine will fai
30410 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f  l with SQLITE_LO
30420 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72  CKED if there ar
30430 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75  e any open.** cu
30440 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
30450 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54  le..**.** If AUT
30460 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c  OVACUUM is enabl
30470 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
30480 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74  at iTable is not
30490 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f   the last.** roo
304a0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  t page in the da
304b0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
304c0 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  n the last root 
304d0 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20  page .** in the 
304e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
304f0 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20   moved into the 
30500 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63  slot formerly oc
30510 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61  cupied by.** iTa
30520 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73  ble and that las
30530 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20  t slot formerly 
30540 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20  occupied by the 
30550 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a  last root page.*
30560 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
30570 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65  e freelist inste
30580 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49  ad of iTable.  I
30590 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a  n this say, all.
305a0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72  ** root pages ar
305b0 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65  e kept at the be
305c0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
305d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
305e0 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73  ich.** is necess
305f0 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55  ary for AUTOVACU
30600 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74  UM to work right
30610 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73  .  *piMoved is s
30620 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61  et to the .** pa
30630 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75  ge number that u
30640 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  sed to be the la
30650 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  st root page in 
30660 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  the file before.
30670 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66  ** the move.  If
30680 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f   no page gets mo
30690 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73  ved, *piMoved is
306a0 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68   set to 0..** Th
306b0 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
306c0 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20   is recorded in 
306d0 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20  meta[3] and the 
306e0 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61  value of.** meta
306f0 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62  [3] is updated b
30700 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  y this procedure
30710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30720 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42  btreeDropTable(B
30730 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
30740 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
30750 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
30760 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
30770 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
30780 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
30790 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
307a0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
307b0 70 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  p) );.  if( p->i
307c0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
307d0 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ITE ){.    retur
307e0 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  n pBt->readOnly 
307f0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
30800 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
30810 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69  ;.  }..  /* It i
30820 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f  s illegal to dro
30830 70 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79  p a table if any
30840 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65   cursors are ope
30850 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  n on the.  ** da
30860 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
30870 62 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d  because in auto-
30880 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20  vacuum mode the 
30890 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a  backend may.  **
308a0 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e   need to move an
308b0 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20  other root-page 
308c0 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65  to fill a gap le
308d0 66 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65  ft by the delete
308e0 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65  d.  ** root page
308f0 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72  . If an open cur
30900 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74 68  sor was using th
30910 69 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65  is page a proble
30920 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63  m would .  ** oc
30930 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cur..  */.  if( 
30940 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pBt->pCursor ){.
30950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30960 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20  E_LOCKED;.  }.. 
30970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
30980 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28  eeGetPage(pBt, (
30990 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50  Pgno)iTable, &pP
309a0 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
309b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
309c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
309d0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20  eeClearTable(p, 
309e0 69 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72  iTable);.  if( r
309f0 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  c ){.    release
30a00 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
30a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
30a20 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b  .  *piMoved = 0;
30a30 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31  ..  if( iTable>1
30a40 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
30a50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30a60 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  M.    rc = freeP
30a70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
30a80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30a90 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  e);.#else.    if
30aa0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
30ab0 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  m ){.      Pgno 
30ac0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
30ad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
30ae0 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
30af0 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  , &maxRootPgno);
30b00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
30b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30b20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30b30 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
30b40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30b50 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54   }..      if( iT
30b60 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e  able==maxRootPgn
30b70 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
30b80 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  If the table bei
30b90 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68  ng dropped is th
30ba0 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
30bb0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
30bc0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
30bd0 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
30be0 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f  base, put the ro
30bf0 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66  ot page on the f
30c00 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ree list. .     
30c10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
30c20 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
30c30 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
30c40 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
30c50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30c60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30c70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
30c80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30c90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30ca0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
30cb0 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73  ing dropped does
30cc0 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61   not have the la
30cd0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
30ce0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
30cf0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
30d00 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70  e. So move the p
30d10 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e  age that does in
30d20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
30d30 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74  ** gap left by t
30d40 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d  he deleted root-
30d50 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
30d60 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
30d70 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20   *pMove;.       
30d80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
30d90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ge);.        rc 
30da0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
30db0 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f  tPage(pBt, maxRo
30dc0 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20  otPgno, &pMove, 
30dd0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
30de0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30df0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
30e00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
30e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
30e20 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
30e30 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Move, PTRMAP_ROO
30e40 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65  TPAGE, 0, iTable
30e50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
30e60 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
30e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30e80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30e90 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30ea0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
30eb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30ec0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
30ed0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
30ee0 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
30ef0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30f00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30f10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30f30 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
30f40 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Move);.        r
30f50 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
30f60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30f70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30f80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
30f90 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
30fa0 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20         *piMoved 
30fb0 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20  = maxRootPgno;. 
30fc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
30fd0 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61   Set the new 'ma
30fe0 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c  x-root-page' val
30ff0 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ue in the databa
31000 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a  se header. This.
31010 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
31020 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f  old value less o
31030 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72  ne, less one mor
31040 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e  e if that happen
31050 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
31060 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d   a root-page num
31070 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67  ber, less one ag
31080 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74  ain if that is t
31090 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44  he.      ** PEND
310a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20  ING_BYTE_PAGE.. 
310b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61       */.      ma
310c0 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
310d0 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
310e0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
310f0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
31100 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e        maxRootPgn
31110 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  o--;.      }.   
31120 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67     if( maxRootPg
31130 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  no==PTRMAP_PAGEN
31140 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  O(pBt, maxRootPg
31150 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  no) ){.        m
31160 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
31170 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
31180 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21  rt( maxRootPgno!
31190 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
311a0 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  GE(pBt) );..    
311b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
311c0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
311d0 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29   4, maxRootPgno)
311e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
311f0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
31200 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  (pPage);.      r
31210 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
31220 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
31230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
31240 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  If sqlite3BtreeD
31250 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c  ropTable was cal
31260 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a  led on page 1. *
31270 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  /.    zeroPage(p
31280 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59  Page, PTF_INTKEY
31290 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20  |PTF_LEAF );.   
312a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
312b0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
312c0 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
312d0 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
312e0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
312f0 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
31300 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
31310 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
31320 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
31330 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
31340 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f  .  rc = btreeDro
31350 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  pTable(p, iTable
31360 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71  , piMoved);.  sq
31370 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
31380 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
31390 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
313a0 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  the meta-informa
313b0 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61  tion out of a da
313c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65  tabase file.  Me
313d0 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20  ta[0].** is the 
313e0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  number of free p
313f0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
31400 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
31410 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f   Meta[1].** thro
31420 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65  ugh meta[15] are
31430 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
31440 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79  se by higher lay
31450 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a  ers.  Meta[0].**
31460 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74   is read-only, t
31470 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65  he others are re
31480 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a  ad/write..** .**
31490 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65   The schema laye
314a0 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76  r numbers meta v
314b0 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c  alues differentl
314c0 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d  y.  At the schem
314d0 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20  a.** layer (and 
314e0 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e  the SetCookie an
314f0 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63  d ReadCookie opc
31500 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72  odes) the number
31510 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65   of.** free page
31520 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  s is not visible
31530 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20  .  So Cookie[0] 
31540 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d  is the same as M
31550 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73  eta[1]..*/.int s
31560 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
31570 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
31580 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61   idx, u32 *pMeta
31590 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
315a0 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
315b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
315c0 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64  *pP1;.  BtShared
315d0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
315e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
315f0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
31600 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
31610 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61  * Reading a meta
31620 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75  -data value requ
31630 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
31640 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20   on page 1 (and 
31650 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73  hence.  ** the s
31660 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
31670 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73  le. We grab this
31680 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73   lock regardless
31690 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20   of whether or. 
316a0 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49   ** not the SQLI
316b0 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
316c0 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28  ed flag is set (
316d0 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
316e0 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20   at page.  ** 1 
316f0 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20  is treated as a 
31700 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20  special case by 
31710 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
31720 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29   and lockTable()
31730 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71  )..  */.  rc = q
31740 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
31750 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
31760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31770 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
31780 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
31790 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
317a0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
317b0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
317c0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
317d0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
317e0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50  pPager, 1, &pDbP
317f0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
31800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
31810 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
31820 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
31830 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64   pP1 = (unsigned
31840 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
31850 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
31860 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d  age);.  *pMeta =
31870 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b 33   get4byte(&pP1[3
31880 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73  6 + idx*4]);.  s
31890 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
318a0 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  (pDbPage);..  /*
318b0 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64   If autovacuumed
318c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
318d0 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77  this build but w
318e0 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
318f0 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20  .  ** access an 
31900 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74  autovacuumed dat
31910 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65  abase, then make
31920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
31930 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69  adonly. .  */.#i
31940 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
31950 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
31960 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65  ( idx==4 && *pMe
31970 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64  ta>0 ) pBt->read
31980 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66  Only = 1;.#endif
31990 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
319a0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
319b0 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c  e 1. */.  rc = l
319c0 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52  ockTable(p, 1, R
319d0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c  EAD_LOCK);.  sql
319e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
319f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
31a00 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d  }../*.** Write m
31a10 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta-information 
31a20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
31a30 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d  tabase.  Meta[0]
31a40 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79   is.** read-only
31a50 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20   and may not be 
31a60 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  written..*/.int 
31a70 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
31a80 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c  teMeta(Btree *p,
31a90 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d   int idx, u32 iM
31aa0 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64  eta){.  BtShared
31ab0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
31ac0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
31ad0 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pP1;.  int rc;.
31ae0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31    assert( idx>=1
31af0 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20   && idx<=15 );. 
31b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
31b10 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
31b20 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
31b30 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
31b40 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
31b50 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
31b60 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
31b70 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
31b80 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
31b90 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
31ba0 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70  age1!=0 );.    p
31bb0 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
31bc0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
31bd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31be0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
31bf0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
31c00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31c10 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
31c20 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
31c30 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66  *4], iMeta);.#if
31c40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31c50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31c60 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a    if( idx==7 ){.
31c70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31c80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31c90 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20  || iMeta==0 );. 
31ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
31cb0 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61  Meta==0 || iMeta
31cc0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
31cd0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
31ce0 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a   iMeta;.      }.
31cf0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
31d00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
31d10 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
31d20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
31d30 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62  eturn the flag b
31d40 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e  yte at the begin
31d50 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65  ning of the page
31d60 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
31d70 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
31d80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
31d90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
31da0 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  eFlags(BtCursor 
31db0 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
31dc0 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55  O: What about CU
31dd0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
31de0 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79   state? Probably
31df0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20   need to call.  
31e00 2a 2a 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ** restoreCursor
31e10 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e  Position() here.
31e20 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  .  */.  MemPage 
31e30 2a 70 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72  *pPage;.  restor
31e40 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
31e50 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
31e60 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
31e70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
31e80 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
31e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31ea0 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42  e->pBt==pCur->pB
31eb0 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  t );.  return pP
31ec0 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61  age ? pPage->aDa
31ed0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
31ee0 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a  set] : 0;.}.../*
31ef0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
31f00 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
31f10 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54  with a BTree.  T
31f20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
31f30 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
31f40 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
31f50 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20   only..*/.Pager 
31f60 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  *sqlite3BtreePag
31f70 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  er(Btree *p){.  
31f80 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
31f90 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65  Pager;.}..#ifnde
31fa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
31fb0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
31fc0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73  .** Append a mes
31fd0 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f  sage to the erro
31fe0 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
31ff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32000 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32010 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
32020 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a  pCheck,.  char *
32030 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zMsg1,.  const c
32040 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20  har *zFormat,.  
32050 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74  ....){.  va_list
32060 20 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65   ap;.  if( !pChe
32070 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75  ck->mxErr ) retu
32080 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78  rn;.  pCheck->mx
32090 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d  Err--;.  pCheck-
320a0 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74  >nErr++;.  va_st
320b0 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
320c0 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  ;.  if( pCheck->
320d0 65 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a  errMsg.nChar ){.
320e0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
320f0 63 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63  cumAppend(&pChec
32100 6b 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c  k->errMsg, "\n",
32110 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a   1);.  }.  if( z
32120 4d 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  Msg1 ){.    sqli
32130 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
32140 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73  d(&pCheck->errMs
32150 67 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20  g, zMsg1, -1);. 
32160 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72   }.  sqlite3VXPr
32170 69 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72  intf(&pCheck->er
32180 72 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74  rMsg, 1, zFormat
32190 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
321a0 61 70 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63  ap);.  if( pChec
321b0 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63  k->errMsg.malloc
321c0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43  Failed ){.    pC
321d0 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  heck->mallocFail
321e0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65  ed = 1;.  }.}.#e
321f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32200 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32210 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
32220 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
32230 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
32240 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72  * Add 1 to the r
32250 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
32260 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20  or page iPage.  
32270 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73  If this is the s
32280 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e  econd.** referen
32290 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20  ce to the page, 
322a0 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  add an error mes
322b0 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e  sage to pCheck->
322c0 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75  zErrMsg..** Retu
322d0 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72  rn 1 if there ar
322e0 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66  e 2 ore more ref
322f0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
32300 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20  age and 0 if.** 
32310 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
32320 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  irst reference t
32330 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  o the page..**.*
32340 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61  * Also check tha
32350 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
32360 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a  r is in bounds..
32370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
32380 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79  eckRef(Integrity
32390 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20  Ck *pCheck, int 
323a0 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f  iPage, char *zCo
323b0 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50  ntext){.  if( iP
323c0 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
323d0 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70  1;.  if( iPage>p
323e0 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20  Check->nPage || 
323f0 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63  iPage<0 ){.    c
32400 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32410 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
32420 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75  "invalid page nu
32430 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29  mber %d", iPage)
32440 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
32450 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b    }.  if( pCheck
32460 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d  ->anRef[iPage]==
32470 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  1 ){.    checkAp
32480 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32490 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72  zContext, "2nd r
324a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
324b0 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
324c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
324d0 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63    return  (pChec
324e0 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b  k->anRef[iPage]+
324f0 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  +)>1;.}..#ifndef
32500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32510 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68  OVACUUM./*.** Ch
32520 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74  eck that the ent
32530 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
32540 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69  r-map for page i
32550 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a  Child maps to .*
32560 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20  * page iParent, 
32570 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72  pointer type ptr
32580 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70  Type. If not, ap
32590 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65  pend an error me
325a0 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65  ssage.** to pChe
325b0 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
325c0 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a  id checkPtrmap(.
325d0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
325e0 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65  Check,   /* Inte
325f0 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74  grity check cont
32600 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ext */.  Pgno iC
32610 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  hild,           
32620 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75  /* Child page nu
32630 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79  mber */.  u8 eTy
32640 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
32650 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
32660 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f  nter map type */
32670 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c  .  Pgno iParent,
32680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
32690 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61  ected pointer ma
326a0 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  p parent page nu
326b0 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
326c0 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
326d0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63   /* Context desc
326e0 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f  ription (used fo
326f0 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a  r error msg) */.
32700 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
32710 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20  8 ePtrmapType;. 
32720 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72   Pgno iPtrmapPar
32730 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72  ent;..  rc = ptr
32740 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  mapGet(pCheck->p
32750 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74  Bt, iChild, &ePt
32760 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d  rmapType, &iPtrm
32770 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  apParent);.  if(
32780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32790 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
327a0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
327b0 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74  ntext, "Failed t
327c0 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65  o read ptrmap ke
327d0 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a  y=%d", iChild);.
327e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
327f0 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79  .  if( ePtrmapTy
32800 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74  pe!=eType || iPt
32810 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72  rmapParent!=iPar
32820 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ent ){.    check
32830 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32840 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
32850 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20     "Bad ptr map 
32860 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70  entry key=%d exp
32870 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f  ected=(%d,%d) go
32880 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20  t=(%d,%d)", .   
32890 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65     iChild, eType
328a0 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d  , iParent, ePtrm
328b0 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50  apType, iPtrmapP
328c0 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  arent);.  }.}.#e
328d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
328e0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
328f0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
32900 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  or of an overflo
32910 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20  w page list..** 
32920 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
32930 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
32940 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e  on the list is N
32950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32960 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e   checkList(.  In
32970 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
32980 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  k,  /* Integrity
32990 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78   checking contex
329a0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65  t */.  int isFre
329b0 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  eList,       /* 
329c0 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c  True for a freel
329d0 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ist.  False for 
329e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
329f0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  st */.  int iPag
32a00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
32a10 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
32a20 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74   first page in t
32a30 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  he list */.  int
32a40 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
32a50 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e     /* Expected n
32a60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
32a70 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
32a80 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
32a90 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
32aa0 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
32ab0 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ges */.){.  int 
32ac0 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65  i;.  int expecte
32ad0 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69  d = N;.  int iFi
32ae0 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77  rst = iPage;.  w
32af0 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26  hile( N-- > 0 &&
32b00 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29   pCheck->mxErr )
32b10 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f  {.    DbPage *pO
32b20 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73  vflPage;.    uns
32b30 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66  igned char *pOvf
32b40 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69  lData;.    if( i
32b50 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20  Page<1 ){.      
32b60 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
32b70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
32b80 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66  .         "%d of
32b90 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e   %d pages missin
32ba0 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20  g from overflow 
32bb0 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
32bc0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
32bd0 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69  N+1, expected, i
32be0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72  First);.      br
32bf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
32c00 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
32c10 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  ck, iPage, zCont
32c20 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ext) ) break;.  
32c30 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
32c40 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50  erGet(pCheck->pP
32c50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67  ager, (Pgno)iPag
32c60 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29  e, &pOvflPage) )
32c70 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32c80 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
32c90 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64  Context, "failed
32ca0 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22   to get page %d"
32cb0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
32cc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
32cd0 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e   pOvflData = (un
32ce0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
32cf0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
32d00 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20  a(pOvflPage);.  
32d10 20 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74    if( isFreeList
32d20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
32d30 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
32d40 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64  lData[4]);.#ifnd
32d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32d60 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
32d70 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
32d80 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
32d90 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
32da0 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ap(pCheck, iPage
32db0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
32dc0 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
32dd0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
32de0 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65        if( n>pChe
32df0 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ck->pBt->usableS
32e00 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20  ize/4-2 ){.     
32e10 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
32e20 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
32e30 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  xt,.           "
32e40 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f  freelist leaf co
32e50 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70  unt too big on p
32e60 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
32e70 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20  .        N--;.  
32e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32e90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
32ea0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
32eb0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20   Pgno iFreePage 
32ec0 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
32ed0 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23  lData[8+i*4]);.#
32ee0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32ef0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32f00 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65          if( pChe
32f10 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
32f20 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
32f30 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
32f40 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
32f50 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
32f60 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
32f70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
32f80 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68  dif.          ch
32f90 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
32fa0 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65  FreePage, zConte
32fb0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xt);.        }. 
32fc0 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20         N -= n;. 
32fd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
32fe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32ff0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33000 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
33010 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
33020 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
33030 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69  cuum and iPage i
33040 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20  s not the last. 
33050 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
33060 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69  this overflow li
33070 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  st, check that t
33080 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
33090 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  ntry for.      *
330a0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
330b0 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61  page matches iPa
330c0 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ge..      */.   
330d0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
330e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
330f0 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & N>0 ){.       
33100 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f   i = get4byte(pO
33110 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20  vflData);.      
33120 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
33130 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f  heck, i, PTRMAP_
33140 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65  OVERFLOW2, iPage
33150 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
33160 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
33170 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65  f.    iPage = ge
33180 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61  t4byte(pOvflData
33190 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
331a0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61  gerUnref(pOvflPa
331b0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ge);.  }.}.#endi
331c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
331d0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
331e0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
331f0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
33200 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44  TY_CHECK./*.** D
33210 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79  o various sanity
33220 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e   checks on a sin
33230 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72  gle page of a tr
33240 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ee.  Return.** t
33250 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20  he tree depth.  
33260 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72  Root pages retur
33270 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66  n 0.  Parents of
33280 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72   root pages.** r
33290 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20  eturn 1, and so 
332a0 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  forth..** .** Th
332b0 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64  ese checks are d
332c0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  one:.**.**      
332d0 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  1.  Make sure th
332e0 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65  at cells and fre
332f0 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f  eblocks do not o
33300 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20  verlap.**       
33310 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74     but combine t
33320 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76  o completely cov
33330 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  er the page..** 
33340 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75   NO  2.  Make su
33350 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65  re cell keys are
33360 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e   in order..**  N
33370 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  3.  Make sure
33380 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20   no key is less 
33390 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
333a0 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zLowerBound..**
333b0 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73    NO  4.  Make s
333c0 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72  ure no key is gr
333d0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
333e0 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75  ual to zUpperBou
333f0 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20  nd..**      5.  
33400 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
33410 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ity of overflow 
33420 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36  pages..**      6
33430 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  .  Recursively c
33440 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67  all checkTreePag
33450 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  e on all childre
33460 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56  n..**      7.  V
33470 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
33480 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c  epth of all chil
33490 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65  dren is the same
334a0 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61  ..**      8.  Ma
334b0 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67  ke sure this pag
334c0 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33  e is at least 33
334d0 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69  % full or else i
334e0 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  t is.**         
334f0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
33500 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
33510 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61   int checkTreePa
33520 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ge(.  IntegrityC
33530 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43  k *pCheck,  /* C
33540 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73  ontext for the s
33550 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20  anity check */. 
33560 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
33570 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
33580 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
33590 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
335a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
335b0 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
335c0 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  page */.  char *
335d0 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20  zParentContext  
335e0 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78  /* Parent contex
335f0 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  t */.){.  MemPag
33600 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
33610 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32  i, rc, depth, d2
33620 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69  , pgno, cnt;.  i
33630 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72  nt hdr, cellStar
33640 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  t;.  int nCell;.
33650 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74    u8 *data;.  Bt
33660 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69  Shared *pBt;.  i
33670 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  nt usableSize;. 
33680 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31   char zContext[1
33690 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74  00];.  char *hit
336a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
336b0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
336c0 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
336d0 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69  , "Page %d: ", i
336e0 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  Page);..  /* Che
336f0 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
33700 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70   exists.  */.  p
33710 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74  Bt = pCheck->pBt
33720 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
33730 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
33740 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30  ;.  if( iPage==0
33750 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
33760 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
33770 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65  ck, iPage, zPare
33780 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74  ntContext) ) ret
33790 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63  urn 0;.  if( (rc
337a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
337b0 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
337c0 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  o)iPage, &pPage,
337d0 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63   0))!=0 ){.    c
337e0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
337f0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
33800 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
33810 6f 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20  o get the page. 
33820 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20  error code=%d", 
33830 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
33840 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63  0;.  }.  if( (rc
33850 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
33860 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70  nitPage(pPage, p
33870 50 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20  Parent))!=0 ){. 
33880 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33890 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
338a0 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  xt, .           
338b0 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
338c0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
338d0 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f  returns error co
338e0 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  de %d", rc);.   
338f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
33900 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
33910 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
33920 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63  ck out all the c
33930 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70  ells..  */.  dep
33940 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  th = 0;.  for(i=
33950 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
33960 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45  l && pCheck->mxE
33970 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  rr; i++){.    u8
33980 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74   *pCell;.    int
33990 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66   sz;.    CellInf
339a0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20  o info;..    /* 
339b0 43 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76  Check payload ov
339c0 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
339d0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
339e0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
339f0 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74  zContext), zCont
33a00 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
33a10 20 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20    "On tree page 
33a20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69  %d cell %d: ", i
33a30 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43  Page, i);.    pC
33a40 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
33a50 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c  Page,i);.    sql
33a60 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
33a70 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
33a80 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
33a90 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b  sz = info.nData;
33aa0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
33ab0 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20  >intKey ) sz += 
33ac0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61  info.nKey;.    a
33ad0 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e  ssert( sz==info.
33ae0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
33af0 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63  if( sz>info.nLoc
33b00 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  al ){.      int 
33b10 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e  nPage = (sz - in
33b20 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62  fo.nLocal + usab
33b30 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61  leSize - 5)/(usa
33b40 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
33b50 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
33b60 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
33b70 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
33b80 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ow]);.#ifndef SQ
33b90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
33ba0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
33bb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
33bc0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50  {.        checkP
33bd0 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67  trmap(pCheck, pg
33be0 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
33bf0 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c  VERFLOW1, iPage,
33c00 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
33c10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
33c20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63   checkList(pChec
33c30 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  k, 0, pgnoOvfl, 
33c40 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  nPage, zContext)
33c50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
33c60 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20  Check sanity of 
33c70 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e  left child page.
33c80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33c90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
33ca0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
33cb0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69  4byte(pCell);.#i
33cc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33cd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33ce0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33cf0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33d00 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
33d10 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d  heck, pgno, PTRM
33d20 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c  AP_BTREE, iPage,
33d30 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
33d40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
33d50 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50   d2 = checkTreeP
33d60 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c  age(pCheck,pgno,
33d70 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b  pPage,zContext);
33d80 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26  .      if( i>0 &
33d90 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20  & d2!=depth ){. 
33da0 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
33db0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
33dc0 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70  ontext, "Child p
33dd0 61 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72  age depth differ
33de0 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s");.      }.   
33df0 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20     depth = d2;. 
33e00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
33e10 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
33e20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
33e30 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
33e40 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
33e50 74 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  t+8]);.    sqlit
33e60 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
33e70 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
33e80 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20  ontext, .       
33e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f                "O
33ea0 6e 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67  n page %d at rig
33eb0 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61  ht child: ", iPa
33ec0 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge);.#ifndef SQL
33ed0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33ee0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
33ef0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
33f00 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
33f10 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50  (pCheck, pgno, P
33f20 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61  TRMAP_BTREE, iPa
33f30 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65  ge, 0);.    }.#e
33f40 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72  ndif.    checkTr
33f50 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70  eePage(pCheck, p
33f60 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e  gno, pPage, zCon
33f70 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f  text);.  }. .  /
33f80 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70  * Check for comp
33f90 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66  lete coverage of
33fa0 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20   the page.  */. 
33fb0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
33fc0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
33fd0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
33fe0 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50    hit = sqlite3P
33ff0 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
34000 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  pageSize );.  if
34010 28 20 68 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( hit==0 ){.    
34020 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61  pCheck->mallocFa
34030 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  iled = 1;.  }els
34040 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69  e{.    memset(hi
34050 74 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65  t, 0, usableSize
34060 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68   );.    memset(h
34070 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28  it, 1, get2byte(
34080 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a  &data[hdr+5]));.
34090 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32      nCell = get2
340a0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
340b0 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72  ]);.    cellStar
340c0 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
340d0 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
340e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
340f0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
34100 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
34110 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72  e(&data[cellStar
34120 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75  t+i*2]);.      u
34130 31 36 20 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  16 size = 1024;.
34140 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
34150 20 20 20 69 66 28 20 70 63 3c 3d 75 73 61 62 6c     if( pc<=usabl
34160 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
34170 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65   size = cellSize
34180 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
34190 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [pc]);.      }. 
341a0 20 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a       if( (pc+siz
341b0 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
341c0 20 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20   || pc<0 ){.    
341d0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
341e0 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
341f0 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
34200 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
34210 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
34220 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
34230 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34240 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63          for(j=pc
34250 2b 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20  +size-1; j>=pc; 
34260 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20  j--) hit[j]++;. 
34270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
34280 20 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65   for(cnt=0, i=ge
34290 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
342a0 2b 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75  +1]); i>0 && i<u
342b0 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74  sableSize && cnt
342c0 3c 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20  <10000; .       
342d0 20 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20      cnt++){.    
342e0 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74    int size = get
342f0 32 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d  2byte(&data[i+2]
34300 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
34310 20 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a        if( (i+siz
34320 65 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65  e-1)>=usableSize
34330 20 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20   || i<0 ){.     
34340 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
34350 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20  g(pCheck, 0,  . 
34360 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72             "Corr
34370 75 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20  uption detected 
34380 69 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61  in cell %d on pa
34390 67 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30  ge %d",i,iPage,0
343a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
343b0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
343c0 73 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d  size-1; j>=i; j-
343d0 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20  -) hit[j]++;.   
343e0 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67     }.      i = g
343f0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d  et2byte(&data[i]
34400 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
34410 28 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62  (i=cnt=0; i<usab
34420 6c 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  leSize; i++){.  
34430 20 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d      if( hit[i]==
34440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74  0 ){.        cnt
34450 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
34460 69 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a  if( hit[i]>1 ){.
34470 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
34480 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
34490 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c  ,.          "Mul
344a0 74 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62  tiple uses for b
344b0 79 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25  yte %d of page %
344c0 64 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20  d", i, iPage);. 
344d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
344e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
344f0 69 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64  if( cnt!=data[hd
34500 72 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68  r+7] ){.      ch
34510 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
34520 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
34530 20 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73     "Fragmented s
34540 70 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20  pace is %d byte 
34550 72 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f  reported as %d o
34560 6e 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20  n page %d",.    
34570 20 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b        cnt, data[
34580 68 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a  hdr+7], iPage);.
34590 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
345a0 74 65 33 50 61 67 65 46 72 65 65 28 68 69 74 29  te3PageFree(hit)
345b0 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
345c0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
345d0 6e 20 64 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e  n depth+1;.}.#en
345e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
345f0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
34600 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
34610 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
34620 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
34630 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
34640 65 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 63 68  es a complete ch
34650 65 63 6b 20 6f 66 20 74 68 65 20 67 69 76 65 6e  eck of the given
34660 20 42 54 72 65 65 20 66 69 6c 65 2e 20 20 61 52   BTree file.  aR
34670 6f 6f 74 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61  oot[] is.** an a
34680 72 72 61 79 20 6f 66 20 70 61 67 65 73 20 6e 75  rray of pages nu
34690 6d 62 65 72 73 20 77 65 72 65 20 65 61 63 68 20  mbers were each 
346a0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 74  page number is t
346b0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a  he root page of.
346c0 2a 2a 20 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f  ** a table.  nRo
346d0 6f 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ot is the number
346e0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
346f0 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  Root..**.** Writ
34700 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
34710 65 72 72 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70  error seen in *p
34720 6e 45 72 72 2e 20 20 45 78 63 65 70 74 20 66 6f  nErr.  Except fo
34730 72 20 73 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a  r some memory.**
34740 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
34750 72 73 2c 20 20 6e 6e 20 65 72 72 6f 72 20 6d 65  rs,  nn error me
34760 73 73 61 67 65 20 69 73 20 68 65 6c 64 20 69 6e  ssage is held in
34770 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
34780 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20   from.** malloc 
34790 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 2a  is returned if *
347a0 70 6e 45 72 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  pnErr is non-zer
347b0 6f 2e 20 20 49 66 20 2a 70 6e 45 72 72 3d 3d 30  o.  If *pnErr==0
347c0 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a   then NULL is.**
347d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
347e0 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
347f0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 0a  IntegrityCheck(.
34800 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
34810 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
34820 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  be checked */.  
34830 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a  int *aRoot,   /*
34840 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f 6f   An array of roo
34850 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20  t pages numbers 
34860 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20 74  for individual t
34870 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rees */.  int nR
34880 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65  oot,    /* Numbe
34890 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
348a0 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aRoot[] */.  int
348b0 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53 74   mxErr,    /* St
348c0 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72 72  op reporting err
348d0 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20 6d  ors after this m
348e0 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  any */.  int *pn
348f0 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65 20  Err    /* Write 
34900 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
34910 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76 61   seen to this va
34920 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  riable */.){.  i
34930 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66  nt i;.  int nRef
34940 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  ;.  IntegrityCk 
34950 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61 72  sCheck;.  BtShar
34960 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
34970 3b 0a 20 20 63 68 61 72 20 7a 45 72 72 5b 31 30  ;.  char zErr[10
34980 30 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  0];..  sqlite3Bt
34990 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
349a0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
349b0 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33    nRef = sqlite3
349c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
349d0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
349e0 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  ( lockBtreeWithR
349f0 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f  etry(p)!=SQLITE_
34a00 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72  OK ){.    *pnErr
34a10 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
34a20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
34a30 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
34a40 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 22 63  e3DbStrDup(0, "c
34a50 61 6e 6e 6f 74 20 61 63 71 75 69 72 65 20 61 20  annot acquire a 
34a60 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
34a70 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d   database");.  }
34a80 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20  .  sCheck.pBt = 
34a90 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50  pBt;.  sCheck.pP
34aa0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
34ab0 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61  er;.  sCheck.nPa
34ac0 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
34ad0 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65  unt(sCheck.pPage
34ae0 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45  r);.  sCheck.mxE
34af0 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43  rr = mxErr;.  sC
34b00 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20  heck.nErr = 0;. 
34b10 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61   sCheck.mallocFa
34b20 69 6c 65 64 20 3d 20 30 3b 0a 20 20 2a 70 6e 45  iled = 0;.  *pnE
34b30 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rr = 0;.#ifndef 
34b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
34b50 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74  VACUUM.  if( pBt
34b60 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ->nTrunc!=0 ){. 
34b70 20 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20     sCheck.nPage 
34b80 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20  = pBt->nTrunc;. 
34b90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
34ba0 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20  sCheck.nPage==0 
34bb0 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  ){.    unlockBtr
34bc0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
34bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
34be0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
34bf0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
34c00 43 68 65 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71  Check.anRef = sq
34c10 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43  lite3Malloc( (sC
34c20 68 65 63 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69  heck.nPage+1)*si
34c30 7a 65 6f 66 28 73 43 68 65 63 6b 2e 61 6e 52 65  zeof(sCheck.anRe
34c40 66 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 21  f[0]) );.  if( !
34c50 73 43 68 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a  sCheck.anRef ){.
34c60 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
34c70 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
34c80 20 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20    *pnErr = 1;.  
34c90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
34ca0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
34cb0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 0;.  }.  for(
34cc0 69 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e  i=0; i<=sCheck.n
34cd0 50 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65  Page; i++){ sChe
34ce0 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b  ck.anRef[i] = 0;
34cf0 20 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47   }.  i = PENDING
34d00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b  _BYTE_PAGE(pBt);
34d10 0a 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b  .  if( i<=sCheck
34d20 2e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43  .nPage ){.    sC
34d30 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20  heck.anRef[i] = 
34d40 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
34d50 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 43  StrAccumInit(&sC
34d60 68 65 63 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72  heck.errMsg, zEr
34d70 72 2c 20 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c  r, sizeof(zErr),
34d80 20 32 30 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43   20000);..  /* C
34d90 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
34da0 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
34db0 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c  st.  */.  checkL
34dc0 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20  ist(&sCheck, 1, 
34dd0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
34de0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
34df0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ),.            g
34e00 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
34e10 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
34e20 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74  , "Main freelist
34e30 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  : ");..  /* Chec
34e40 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  k all the tables
34e50 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
34e60 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68  ; i<nRoot && sCh
34e70 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
34e80 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69  .    if( aRoot[i
34e90 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
34ea0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34eb0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
34ec0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
34ed0 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74  oVacuum && aRoot
34ee0 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63  [i]>1 ){.      c
34ef0 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65  heckPtrmap(&sChe
34f00 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54  ck, aRoot[i], PT
34f10 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
34f20 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
34f30 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
34f40 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52  Page(&sCheck, aR
34f50 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74  oot[i], 0, "List
34f60 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20   of tree roots: 
34f70 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ");.  }..  /* Ma
34f80 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61  ke sure every pa
34f90 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  ge in the file i
34fa0 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a  s referenced.  *
34fb0 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  /.  for(i=1; i<=
34fc0 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20  sCheck.nPage && 
34fd0 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
34fe0 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  +){.#ifdef SQLIT
34ff0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
35000 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  M.    if( sCheck
35010 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a  .anRef[i]==0 ){.
35020 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
35030 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
35040 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
35050 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
35060 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
35070 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
35080 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
35090 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65  acuum, make sure
350a0 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61   no tables conta
350b0 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  in.    ** refere
350c0 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d  nces to pointer-
350d0 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a  map pages..    *
350e0 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  /.    if( sCheck
350f0 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20  .anRef[i]==0 && 
35100 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
35110 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d  PAGENO(pBt, i)!=
35120 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56  i || !pBt->autoV
35130 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20  acuum) ){.      
35140 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
35150 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65  sCheck, 0, "Page
35160 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65   %d is never use
35170 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  d", i);.    }.  
35180 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
35190 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20  ef[i]!=0 && .   
351a0 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
351b0 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26  NO(pBt, i)==i &&
351c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
351d0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
351e0 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
351f0 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d  k, 0, "Pointer m
35200 61 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65  ap page %d is re
35210 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20  ferenced", i);. 
35220 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
35230 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
35240 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69  this analysis di
35250 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20  d not leave any 
35260 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20  unref() pages.  
35270 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  */.  unlockBtree
35280 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
35290 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c   if( nRef != sql
352a0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
352b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
352c0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
352d0 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
352e0 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e   .      "Outstan
352f0 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20  ding page count 
35300 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20  goes from %d to 
35310 25 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61  %d during this a
35320 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20  nalysis",.      
35330 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67  nRef, sqlite3Pag
35340 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
35350 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20  pPager).    );. 
35360 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20   }..  /* Clean  
35370 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72  up and report er
35380 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rors..  */.  sql
35390 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
353a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
353b0 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b  e(sCheck.anRef);
353c0 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6d 61  .  if( sCheck.ma
353d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
353e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
353f0 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65  mReset(&sCheck.e
35400 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45  rrMsg);.    *pnE
35410 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72  rr = sCheck.nErr
35420 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
35430 3b 0a 20 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d  ;.  }.  *pnErr =
35440 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20   sCheck.nErr;.  
35450 69 66 28 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d  if( sCheck.nErr=
35460 3d 30 20 29 20 73 71 6c 69 74 65 33 53 74 72 41  =0 ) sqlite3StrA
35470 63 63 75 6d 52 65 73 65 74 28 26 73 43 68 65 63  ccumReset(&sChec
35480 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20 72 65 74  k.errMsg);.  ret
35490 75 72 6e 20 73 71 6c 69 74 65 33 53 74 72 41 63  urn sqlite3StrAc
354a0 63 75 6d 46 69 6e 69 73 68 28 26 73 43 68 65 63  cumFinish(&sChec
354b0 6b 2e 65 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e  k.errMsg);.}.#en
354c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
354d0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
354e0 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  CK */../*.** Ret
354f0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
35500 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64  hname of the und
35510 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
35520 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
35530 20 70 61 67 65 72 20 66 69 6c 65 6e 61 6d 65 20   pager filename 
35540 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
35550 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
35560 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
35570 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
35580 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
35590 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
355a0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
355b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
355c0 69 6c 65 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  ilename(Btree *p
355d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
355e0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
355f0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
35600 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
35610 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
35620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
35630 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
35640 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74   the directory t
35650 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
35660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
35670 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
35680 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 69  directory name i
35690 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c  s invariant as l
356a0 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72  ong as the pager
356b0 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69   is.** open so i
356c0 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63  t is safe to acc
356d0 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20  ess without the 
356e0 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a  BtShared mutex..
356f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
35700 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69  qlite3BtreeGetDi
35710 72 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b  rname(Btree *p){
35720 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42  .  assert( p->pB
35730 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t->pPager!=0 );.
35740 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
35750 50 61 67 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e  PagerDirname(p->
35760 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
35770 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
35780 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
35790 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
357a0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
357b0 2e 20 54 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20  . The return.** 
357c0 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 72 6f  value of this ro
357d0 75 74 69 6e 65 20 69 73 20 74 68 65 20 73 61 6d  utine is the sam
357e0 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  e regardless of 
357f0 77 68 65 74 68 65 72 20 74 68 65 20 6a 6f 75 72  whether the jour
35800 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  nal file.** has 
35810 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 72 20  been created or 
35820 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  not..**.** The p
35830 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ager journal fil
35840 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61  ename is invaria
35850 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
35860 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
35870 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
35880 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
35890 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
358a0 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
358b0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
358c0 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
358d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
358e0 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50  sert( p->pBt->pP
358f0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  ager!=0 );.  ret
35900 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
35910 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70  Journalname(p->p
35920 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
35930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35940 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
35950 20 43 6f 70 79 20 74 68 65 20 63 6f 6d 70 6c 65   Copy the comple
35960 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42  te content of pB
35970 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f  tFrom into pBtTo
35980 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
35990 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61 63 74 69  .** must be acti
359a0 76 65 20 66 6f 72 20 62 6f 74 68 20 66 69 6c 65  ve for both file
359b0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  s..**.** The siz
359c0 65 20 6f 66 20 66 69 6c 65 20 70 54 6f 20 6d 61  e of file pTo ma
359d0 79 20 62 65 20 72 65 64 75 63 65 64 20 62 79 20  y be reduced by 
359e0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
359f0 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
35a00 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 65 20 74  oes wrong, the t
35a10 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54  ransaction on pT
35a20 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o is rolled back
35a30 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
35a40 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68  essful, CommitPh
35a50 61 73 65 4f 6e 65 28 29 20 6d 61 79 20 62 65 20  aseOne() may be 
35a60 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65  called on pTo be
35a70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
35a80 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
35a90 68 6f 75 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d  hould finish com
35aa0 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e  mitting the tran
35ab0 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62  saction on pTo b
35ac0 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  y calling.** sql
35ad0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
35ae0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
35af0 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42   btreeCopyFile(B
35b00 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
35b10 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
35b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35b30 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e    Pgno i;..  Pgn
35b40 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20 20 20 20  o nFromPage;    
35b50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
35b60 67 65 73 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a  ges in pFrom */.
35b70 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20    Pgno nToPage; 
35b80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35b90 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20  of pages in pTo 
35ba0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61  */.  Pgno nNewPa
35bb0 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ge;      /* Numb
35bc0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
35bd0 54 6f 20 61 66 74 65 72 20 74 68 65 20 63 6f 70  To after the cop
35be0 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b  y */..  Pgno iSk
35bf0 69 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ip;         /* P
35c00 65 6e 64 69 6e 67 20 62 79 74 65 20 70 61 67 65  ending byte page
35c10 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74   in pTo */.  int
35c20 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 20 20   nToPageSize;   
35c30 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66   /* Page size of
35c40 20 70 54 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f   pTo in bytes */
35c50 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65  .  int nFromPage
35c60 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67 65 20 73  Size;  /* Page s
35c70 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20  ize of pFrom in 
35c80 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68  bytes */..  BtSh
35c90 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20 70 54  ared *pBtTo = pT
35ca0 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68 61 72  o->pBt;.  BtShar
35cb0 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46  ed *pBtFrom = pF
35cc0 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54  rom->pBt;.  pBtT
35cd0 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b  o->db = pTo->db;
35ce0 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d  .  pBtFrom->db =
35cf0 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e   pFrom->db;..  n
35d00 54 6f 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  ToPageSize = pBt
35d10 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  To->pageSize;.  
35d20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20  nFromPageSize = 
35d30 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a  pBtFrom->pageSiz
35d40 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69  e;..  if( pTo->i
35d50 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
35d60 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e  ITE || pFrom->in
35d70 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
35d80 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
35d90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
35da0 20 7d 0a 20 20 69 66 28 20 70 42 74 54 6f 2d 3e   }.  if( pBtTo->
35db0 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  pCursor ){.    r
35dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
35dd0 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67  Y;.  }..  nToPag
35de0 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
35df0 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nt(pBtTo->pPager
35e00 29 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d  );.  nFromPage =
35e10 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
35e20 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29  pBtFrom->pPager)
35e30 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50 45 4e 44  ;.  iSkip = PEND
35e40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35e50 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69  tTo);..  /* Vari
35e60 61 62 6c 65 20 6e 4e 65 77 50 61 67 65 20 69 73  able nNewPage is
35e70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
35e80 61 67 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ages required to
35e90 20 73 74 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20   store the.  ** 
35ea0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 46 72 6f  contents of pFro
35eb0 6d 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  m using the curr
35ec0 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  ent page-size of
35ed0 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65   pTo..  */.  nNe
35ee0 77 50 61 67 65 20 3d 20 28 28 69 36 34 29 6e 46  wPage = ((i64)nF
35ef0 72 6f 6d 50 61 67 65 20 2a 20 28 69 36 34 29 6e  romPage * (i64)n
35f00 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2b 20 28  FromPageSize + (
35f10 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 20  i64)nToPageSize 
35f20 2d 20 31 29 20 2f 20 0a 20 20 20 20 20 20 28 69  - 1) / .      (i
35f30 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a  64)nToPageSize;.
35f40 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d  .  for(i=1; rc==
35f50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c  SQLITE_OK && (i<
35f60 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e  =nToPage || i<=n
35f70 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a  NewPage); i++){.
35f80 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20  .    /* Journal 
35f90 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
35fa0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
35fb0 20 69 53 6b 69 70 20 69 73 20 74 68 65 20 70 61   iSkip is the pa
35fc0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
35fd0 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 28 50   locking page (P
35fe0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35ff0 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64 61 74 61  ).    ** in data
36000 62 61 73 65 20 2a 70 54 6f 20 28 62 65 66 6f 72  base *pTo (befor
36010 65 20 74 68 65 20 63 6f 70 79 29 2e 20 54 68 69  e the copy). Thi
36020 73 20 70 61 67 65 20 69 73 20 6e 65 76 65 72 20  s page is never 
36030 77 72 69 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20  written .    ** 
36040 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
36050 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d   file. Unless i=
36060 3d 69 53 6b 69 70 20 6f 72 20 74 68 65 20 70 61  =iSkip or the pa
36070 67 65 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a  ge was not.    *
36080 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 70 54 6f  * present in pTo
36090 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79   before the copy
360a0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72   operation, jour
360b0 6e 61 6c 20 70 61 67 65 20 69 20 66 72 6f 6d 20  nal page i from 
360c0 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  pTo..    */.    
360d0 69 66 28 20 69 21 3d 69 53 6b 69 70 20 26 26 20  if( i!=iSkip && 
360e0 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20  i<=nToPage ){.  
360f0 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
36100 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
36110 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36120 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  Get(pBtTo->pPage
36130 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65 29 3b  r, i, &pDbPage);
36140 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
36150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36170 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
36180 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
36190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
361a0 26 20 69 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b  & i>nFromPage ){
361b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 59 65  .          /* Ye
361c0 61 68 2e 20 20 49 74 20 73 65 65 6d 73 20 77 69  ah.  It seems wi
361d0 65 72 64 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74  erd to call Dont
361e0 57 72 69 74 65 28 29 20 72 69 67 68 74 20 61 66  Write() right af
361f0 74 65 72 20 57 72 69 74 65 28 29 2e 20 42 75 74  ter Write(). But
36200 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
36210 61 74 20 69 73 20 62 65 63 61 75 73 65 20 74 68  at is because th
36220 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 6f 73 65  e names of those
36230 20 70 72 6f 63 65 64 75 72 65 73 20 64 6f 20 6e   procedures do n
36240 6f 74 20 65 78 61 63 74 6c 79 20 0a 20 20 20 20  ot exactly .    
36250 20 20 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65        ** represe
36260 6e 74 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e  nt what they do.
36270 20 20 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79    Write() really
36280 20 6d 65 61 6e 73 20 22 70 75 74 20 74 68 69 73   means "put this
36290 20 70 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20   page in the.   
362a0 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61         ** rollba
362b0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d  ck journal and m
362c0 61 72 6b 20 69 74 20 61 73 20 64 69 72 74 79 20  ark it as dirty 
362d0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
362e0 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  be written.     
362f0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64       ** to the d
36300 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c 61 74  atabase file lat
36310 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74 65 28  er."  DontWrite(
36320 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73 65 63  ) undoes the sec
36330 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20 20 20  ond part of.    
36340 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 6e        ** that an
36350 64 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  d prevents the p
36360 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77  age from being w
36370 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
36380 74 61 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20  tabase. The.    
36390 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
363a0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f   still on the ro
363b0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
363c0 74 68 6f 75 67 68 2e 20 20 41 6e 64 20 74 68 61  though.  And tha
363d0 74 20 69 73 20 74 68 65 20 0a 20 20 20 20 20 20  t is the .      
363e0 20 20 20 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69      ** whole poi
363f0 6e 74 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b  nt of this block
36400 3a 20 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f  : to put pages o
36410 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
36420 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20  ournal. .       
36430 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
36440 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
36450 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61  rDontWrite(pDbPa
36460 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
36470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
36480 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
36490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
364a0 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69  ..    /* Overwri
364b0 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 70  te the data in p
364c0 61 67 65 20 69 20 6f 66 20 74 68 65 20 74 61 72  age i of the tar
364d0 67 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  get database */.
364e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
364f0 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69  TE_OK && i!=iSki
36500 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65  p && i<=nNewPage
36510 20 29 7b 0a 0a 20 20 20 20 20 20 44 62 50 61 67   ){..      DbPag
36520 65 20 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a  e *pToPage = 0;.
36530 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
36540 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  t64 iOff;..     
36550 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36560 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  erGet(pBtTo->pPa
36570 67 65 72 2c 20 69 2c 20 26 70 54 6f 50 61 67 65  ger, i, &pToPage
36580 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
36590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
365a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
365b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 6f  e3PagerWrite(pTo
365c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Page);.      }..
365d0 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20        for(.     
365e0 20 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54     iOff=(i-1)*nT
365f0 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20  oPageSize; .    
36600 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
36610 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50  K && iOff<i*nToP
36620 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20  ageSize; .      
36630 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50    iOff += nFromP
36640 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 29 7b  ageSize.      ){
36650 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
36660 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a  *pFromPage = 0;.
36670 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
36680 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d  om = (iOff/nFrom
36690 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20  PageSize)+1;..  
366a0 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
366b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
366c0 47 45 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20  GE(pBtFrom) ){. 
366d0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
366e0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  e;.        }..  
366f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36700 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46 72  e3PagerGet(pBtFr
36710 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f  om->pPager, iFro
36720 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a  m, &pFromPage);.
36730 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
36740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36750 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
36760 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
36770 65 74 44 61 74 61 28 70 54 6f 50 61 67 65 29 3b  etData(pToPage);
36780 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
36790 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33  *zFrom = sqlite3
367a0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46 72  PagerGetData(pFr
367b0 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  omPage);.       
367c0 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20     int nCopy;.. 
367d0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 46 72           if( nFr
367e0 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50  omPageSize>=nToP
367f0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
36800 20 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20         zFrom += 
36810 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69  ((i-1)*nToPageSi
36820 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a  ze - ((iFrom-1)*
36830 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b  nFromPageSize));
36840 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
36850 70 79 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65  py = nToPageSize
36860 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
36870 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e{.            z
36880 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31  To += (((iFrom-1
36890 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  )*nFromPageSize)
368a0 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65   - (i-1)*nToPage
368b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
368c0 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d     nCopy = nFrom
368d0 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  PageSize;.      
368e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
368f0 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72   memcpy(zTo, zFr
36900 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09 20 20 73  om, nCopy);..  s
36910 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36920 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20  (pFromPage);.   
36930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
36940 20 20 20 20 20 20 69 66 28 20 70 54 6f 50 61 67        if( pToPag
36950 65 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  e ) sqlite3Pager
36960 55 6e 72 65 66 28 70 54 6f 50 61 67 65 29 3b 0a  Unref(pToPage);.
36970 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
36980 49 66 20 74 68 69 6e 67 73 20 68 61 76 65 20 77  If things have w
36990 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c 20 74 68  orked so far, th
369a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
369b0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 0a  may need to be .
369c0 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e 20    ** truncated. 
369d0 54 68 65 20 63 6f 6d 70 6c 65 78 20 70 61 72 74  The complex part
369e0 20 69 73 20 74 68 61 74 20 69 74 20 6d 61 79 20   is that it may 
369f0 6e 65 65 64 20 74 6f 20 62 65 20 74 72 75 6e 63  need to be trunc
36a00 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73  ated to.  ** a s
36a10 69 7a 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ize that is not 
36a20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
36a30 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67 65 53 69  ple of nToPageSi
36a40 7a 65 20 2d 20 74 68 65 20 63 75 72 72 65 6e 74  ze - the current
36a50 0a 20 20 2a 2a 20 70 61 67 65 20 73 69 7a 65 20  .  ** page size 
36a60 75 73 65 64 20 62 79 20 74 68 65 20 70 61 67 65  used by the page
36a70 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
36a80 68 20 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20  h B-Tree pTo..  
36a90 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d  **.  ** For exam
36aa0 70 6c 65 2c 20 73 61 79 20 74 68 65 20 70 61 67  ple, say the pag
36ab0 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 73  e-size of pTo is
36ac0 20 32 30 34 38 20 62 79 74 65 73 20 61 6e 64 20   2048 bytes and 
36ad0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20  the original .  
36ae0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
36af0 65 73 20 69 73 20 35 20 28 31 30 20 4b 42 20 66  es is 5 (10 KB f
36b00 69 6c 65 29 2e 20 49 66 20 70 46 72 6f 6d 20 68  ile). If pFrom h
36b10 61 73 20 61 20 70 61 67 65 20 73 69 7a 65 20 6f  as a page size o
36b20 66 20 31 30 32 34 20 0a 20 20 2a 2a 20 62 79 74  f 1024 .  ** byt
36b30 65 73 20 61 6e 64 20 39 20 70 61 67 65 73 2c 20  es and 9 pages, 
36b40 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 65  then the file ne
36b50 65 64 73 20 74 6f 20 62 65 20 74 72 75 6e 63 61  eds to be trunca
36b60 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f  ted to 9KB..  */
36b70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
36b80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
36b90 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e  nFromPageSize!=n
36ba0 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ToPageSize ){.  
36bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
36bc0 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *pFile = sqlite
36bd0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 54 6f  3PagerFile(pBtTo
36be0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
36bf0 20 69 36 34 20 69 53 69 7a 65 20 3d 20 28 69 36   i64 iSize = (i6
36c00 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20  4)nFromPageSize 
36c10 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65  * (i64)nFromPage
36c20 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4e 6f 77  ;.      i64 iNow
36c30 20 3d 20 28 69 36 34 29 28 28 6e 54 6f 50 61 67   = (i64)((nToPag
36c40 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50  e>nNewPage)?nToP
36c50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20  age:nNewPage) * 
36c60 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65  (i64)nToPageSize
36c70 3b 20 0a 20 20 20 20 20 20 69 36 34 20 69 50 65  ; .      i64 iPe
36c80 6e 64 69 6e 67 20 3d 20 28 28 69 36 34 29 50 45  nding = ((i64)PE
36c90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
36ca0 70 42 74 54 6f 29 2d 31 29 20 2a 28 69 36 34 29  pBtTo)-1) *(i64)
36cb0 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a  nToPageSize;.  .
36cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
36cd0 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a  ize<=iNow );.  .
36ce0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20        /* Commit 
36cf0 70 68 61 73 65 20 6f 6e 65 20 73 79 6e 63 73 20  phase one syncs 
36d00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36d10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
36d20 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63   pTo .      ** c
36d30 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6f 72  ontaining the or
36d40 69 67 69 6e 61 6c 20 64 61 74 61 2e 20 49 74 20  iginal data. It 
36d50 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63 20 74 68  does not sync th
36d60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
36d70 20 20 20 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e        ** itself.
36d80 20 41 66 74 65 72 20 64 6f 69 6e 67 20 74 68 69   After doing thi
36d90 73 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  s it is safe to 
36da0 75 73 65 20 4f 73 54 72 75 6e 63 61 74 65 28 29  use OsTruncate()
36db0 20 61 6e 64 20 6f 74 68 65 72 0a 20 20 20 20 20   and other.     
36dc0 20 2a 2a 20 66 69 6c 65 20 41 50 49 73 20 6f 6e   ** file APIs on
36dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36de0 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20  le directly..   
36df0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 54     */.      pBtT
36e00 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b  o->db = pTo->db;
36e10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36e20 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
36e30 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50  aseOne(pBtTo->pP
36e40 61 67 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a  ager, 0, 0, 1);.
36e50 20 20 20 20 20 20 69 66 28 20 69 53 69 7a 65 3c        if( iSize<
36e60 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c 49  iNow && rc==SQLI
36e70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
36e90 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2c 20 69  runcate(pFile, i
36ea0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
36eb0 20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c   .      /* The l
36ec0 6f 6f 70 20 74 68 61 74 20 63 6f 70 69 65 64 20  oop that copied 
36ed0 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61  data from databa
36ee0 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20  se pFrom to pTo 
36ef0 64 69 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  did not.      **
36f00 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   populate the lo
36f10 63 6b 69 6e 67 20 70 61 67 65 20 6f 66 20 64 61  cking page of da
36f20 74 61 62 61 73 65 20 70 54 6f 2e 20 49 66 20 74  tabase pTo. If t
36f30 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a  he page-size of.
36f40 20 20 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69        ** pFrom i
36f50 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
36f60 68 61 74 20 6f 66 20 70 54 6f 2c 20 74 68 69 73  hat of pTo, this
36f70 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64 61 74 61   means some data
36f80 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e   will.      ** n
36f90 6f 74 20 68 61 76 65 20 62 65 65 6e 20 63 6f 70  ot have been cop
36fa0 69 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ied. .      **. 
36fb0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f       ** This blo
36fc0 63 6b 20 63 6f 70 69 65 73 20 74 68 65 20 6d 69  ck copies the mi
36fd0 73 73 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20  ssing data from 
36fe0 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74  database pFrom t
36ff0 6f 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20  o pTo .      ** 
37000 75 73 69 6e 67 20 66 69 6c 65 20 41 50 49 73 2e  using file APIs.
37010 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
37020 63 61 75 73 65 20 61 74 20 74 68 69 73 20 70 6f  cause at this po
37030 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  int we know that
37040 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66  .      ** all of
37050 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
37060 74 61 20 66 72 6f 6d 20 70 54 6f 20 68 61 73 20  ta from pTo has 
37070 62 65 65 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f  been synced into
37080 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a   the .      ** j
37090 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20  ournal file. At 
370a0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
370b0 75 6c 64 20 62 65 20 73 61 66 65 20 74 6f 20 64  uld be safe to d
370c0 6f 20 61 6e 79 74 68 69 6e 67 20 61 74 0a 20 20  o anything at.  
370d0 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68      ** all to th
370e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
370f0 65 78 63 65 70 74 20 74 72 75 6e 63 61 74 65 20  except truncate 
37100 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
37110 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
37120 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37130 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61 67 65 53  OK && nFromPageS
37140 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65 20  ize<nToPageSize 
37150 26 26 20 69 53 69 7a 65 3e 69 50 65 6e 64 69 6e  && iSize>iPendin
37160 67 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  g){.        i64 
37170 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66 6f  iOff;.        fo
37180 72 28 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  r(.          iOf
37190 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20 20  f=iPending; .   
371a0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
371b0 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69 50  E_OK && iOff<(iP
371c0 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53 69  ending+nToPageSi
371d0 7a 65 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20  ze); .          
371e0 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67  iOff += nFromPag
371f0 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 29 7b  eSize.        ){
37200 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
37210 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30  e *pFromPage = 0
37220 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
37230 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e   iFrom = (iOff/n
37240 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b  FromPageSize)+1;
37250 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66  .  .          if
37260 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47  ( iFrom==PENDING
37270 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 46 72  _BYTE_PAGE(pBtFr
37280 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72  om) || iFrom>nFr
37290 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  omPage ){.      
372a0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
372b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20            }.  . 
372c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
372d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
372e0 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69  tFrom->pPager, i
372f0 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65  From, &pFromPage
37300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
37310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37320 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
37330 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69  ar *zFrom = sqli
37340 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
37350 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20  pFromPage);.    
37360 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37370 69 74 65 33 4f 73 57 72 69 74 65 28 70 46 69 6c  ite3OsWrite(pFil
37380 65 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50  e, zFrom, nFromP
37390 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 29 3b 0a  ageSize, iOff);.
373a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
373b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 46  te3PagerUnref(pF
373c0 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
373d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
373e0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
373f0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
37400 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
37410 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37440 65 72 53 79 6e 63 28 70 42 74 54 6f 2d 3e 70 50  erSync(pBtTo->pP
37450 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
37460 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37470 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37480 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d  rTruncate(pBtTo-
37490 3e 70 50 61 67 65 72 2c 20 6e 4e 65 77 50 61 67  >pPager, nNewPag
374a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
374b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
374c0 29 7b 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e  ){.      pBtTo->
374d0 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
374e0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
374f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
37500 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
37510 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20  ck(pTo);.  }..  
37520 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69  return rc;  .}.i
37530 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
37540 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70  opyFile(Btree *p
37550 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d  To, Btree *pFrom
37560 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
37570 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
37580 28 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  (pTo);.  sqlite3
37590 42 74 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d  BtreeEnter(pFrom
375a0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
375b0 6f 70 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72  opyFile(pTo, pFr
375c0 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  om);.  sqlite3Bt
375d0 72 65 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b  reeLeave(pFrom);
375e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
375f0 65 61 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74  eave(pTo);.  ret
37600 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
37610 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
37620 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  _VACUUM */../*.*
37630 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
37640 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  o if a transacti
37650 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
37660 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
37670 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65  eIsInTrans(Btree
37680 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
37690 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  p==0 || sqlite3_
376a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
376b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
376c0 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69  turn (p && (p->i
376d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
376e0 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ITE));.}../*.** 
376f0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
37700 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  if a statement t
37710 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
37720 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
37730 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d  ite3BtreeIsInStm
37740 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  t(Btree *p){.  a
37750 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
37760 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
37770 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
37780 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e  >pBt && p->pBt->
37790 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  inStmt);.}../*.*
377a0 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
377b0 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72 20  o if a read (or 
377c0 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
377d0 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
377e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
377f0 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42  eIsInReadTrans(B
37800 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
37810 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37820 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
37830 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
37840 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
37850 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29  ns!=TRANS_NONE))
37860 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
37870 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
37880 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
37890 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
378a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
378b0 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65  * a single share
378c0 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d  d-btree. The mem
378d0 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20 63  ory is used by c
378e0 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69  lient code for i
378f0 74 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73  ts own.** purpos
37900 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c  es (for example,
37910 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68   to store a high
37920 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73  -level schema as
37930 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
37940 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  * the shared-btr
37950 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c  ee). The btree l
37960 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66  ayer manages ref
37970 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20  erence counting 
37980 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  issues..**.** Th
37990 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
379a0 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  s is called on a
379b0 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e   shared-btree, n
379c0 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d  Bytes bytes of m
379d0 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c  emory.** are all
379e0 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20  ocated, zeroed, 
379f0 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20  and returned to 
37a00 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20  the caller. For 
37a10 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
37a20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79  .** call the nBy
37a30 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  tes parameter is
37a40 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70   ignored and a p
37a50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61  ointer to the sa
37a60 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65  me blob.** of me
37a70 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a  mory returned. .
37a80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 42 79  **.** If the nBy
37a90 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  tes parameter is
37aa0 20 30 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 20   0 and the blob 
37ab0 6f 66 20 6d 65 6d 6f 72 79 20 68 61 73 20 6e 6f  of memory has no
37ac0 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 61 6c  t yet been.** al
37ad0 6c 6f 63 61 74 65 64 2c 20 61 20 6e 75 6c 6c 20  located, a null 
37ae0 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75 72  pointer is retur
37af0 6e 65 64 2e 20 49 66 20 74 68 65 20 62 6c 6f 62  ned. If the blob
37b00 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
37b10 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20  n.** allocated, 
37b20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  it is returned a
37b30 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2a 0a 2a 2a 20  s normal..**.** 
37b40 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20  Just before the 
37b50 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73 20  shared-btree is 
37b60 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63  closed, the func
37b70 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  tion passed as t
37b80 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67  he .** xFree arg
37b90 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d  ument when the m
37ba0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
37bb0 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76   was made is inv
37bc0 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  oked on the .** 
37bd0 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65  blob of allocate
37be0 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66  d memory. This f
37bf0 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
37c00 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ot call sqlite3_
37c10 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65  free().** on the
37c20 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72   memory, the btr
37c30 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68  ee layer does th
37c40 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  at..*/.void *sql
37c50 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
37c60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42  Btree *p, int nB
37c70 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65  ytes, void(*xFre
37c80 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42  e)(void *)){.  B
37c90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
37ca0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
37cb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
37cc0 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65   if( !pBt->pSche
37cd0 6d 61 20 26 26 20 6e 42 79 74 65 73 20 29 7b 0a  ma && nBytes ){.
37ce0 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65 6d 61      pBt->pSchema
37cf0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
37d00 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b 0a 20 20  Zero(nBytes);.  
37d10 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
37d20 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a  ma = xFree;.  }.
37d30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
37d40 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
37d50 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d   pBt->pSchema;.}
37d60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
37d70 72 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75  rue if another u
37d80 73 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ser of the same 
37d90 73 68 61 72 65 64 20 62 74 72 65 65 20 61 73 20  shared btree as 
37da0 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  the argument.** 
37db0 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20  handle holds an 
37dc0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
37dd0 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
37de0 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  ter table..*/.in
37df0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  t sqlite3BtreeSc
37e00 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65  hemaLocked(Btree
37e10 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
37e20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37e30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
37e40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
37e50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
37e60 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 71 75  r(p);.  rc = (qu
37e70 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
37e80 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
37e90 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f  D_LOCK)!=SQLITE_
37ea0 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  OK);.  sqlite3Bt
37eb0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
37ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69  eturn rc;.}...#i
37ed0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37ee0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
37ef0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f  *.** Obtain a lo
37f00 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
37f10 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20  whose root page 
37f20 69 73 20 69 54 61 62 2e 20 20 54 68 65 0a 2a 2a  is iTab.  The.**
37f30 20 6c 6f 63 6b 20 69 73 20 61 20 77 72 69 74 65   lock is a write
37f40 20 6c 6f 63 6b 20 69 66 20 69 73 57 72 69 74 65   lock if isWrite
37f50 6c 6f 63 6b 20 69 73 20 74 72 75 65 20 6f 72 20  lock is true or 
37f60 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69  a read lock.** i
37f70 66 20 69 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a  f it is false..*
37f80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
37f90 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65  eeLockTable(Btre
37fa0 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20  e *p, int iTab, 
37fb0 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b  u8 isWriteLock){
37fc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37fd0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
37fe0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
37ff0 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 52 45  u8 lockType = RE
38000 41 44 5f 4c 4f 43 4b 20 2b 20 69 73 57 72 69 74  AD_LOCK + isWrit
38010 65 4c 6f 63 6b 3b 0a 20 20 20 20 61 73 73 65 72  eLock;.    asser
38020 74 28 20 52 45 41 44 5f 4c 4f 43 4b 2b 31 3d 3d  t( READ_LOCK+1==
38030 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
38040 20 20 61 73 73 65 72 74 28 20 69 73 57 72 69 74    assert( isWrit
38050 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73 57 72  eLock==0 || isWr
38060 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  iteLock==1 );.  
38070 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
38080 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
38090 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
380a0 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70  p, iTab, lockTyp
380b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
380c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
380d0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c     rc = lockTabl
380e0 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54  e(p, iTab, lockT
380f0 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ype);.    }.    
38100 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
38110 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
38120 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
38130 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
38140 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
38150 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 73  .** Argument pCs
38160 72 20 6d 75 73 74 20 62 65 20 61 20 63 75 72 73  r must be a curs
38170 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  or opened for wr
38180 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20  iting on an .** 
38190 49 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75 72  INTKEY table cur
381a0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
381b0 61 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c 65  at a valid table
381c0 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69 73   entry. .** This
381d0 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69   function modifi
381e0 65 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  es the data stor
381f0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
38200 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c  at entry..** Onl
38210 79 20 74 68 65 20 64 61 74 61 20 63 6f 6e 74 65  y the data conte
38220 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6d  nt may only be m
38230 6f 64 69 66 69 65 64 2c 20 69 74 20 69 73 20 6e  odified, it is n
38240 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  ot possible.** t
38250 6f 20 63 68 61 6e 67 65 20 74 68 65 20 6c 65 6e  o change the len
38260 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
38270 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  stored..*/.int s
38280 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
38290 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 73  ta(BtCursor *pCs
382a0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
382b0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a 29  32 amt, void *z)
382c0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
382d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 73  orHoldsMutex(pCs
382e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
382f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
38300 6c 64 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2d  ld(pCsr->pBtree-
38310 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
38320 20 61 73 73 65 72 74 28 70 43 73 72 2d 3e 69 73   assert(pCsr->is
38330 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b  IncrblobHandle);
38340 0a 0a 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ..  restoreCurso
38350 72 50 6f 73 69 74 69 6f 6e 28 70 43 73 72 29 3b  rPosition(pCsr);
38360 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
38370 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
38380 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
38390 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74   if( pCsr->eStat
383a0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
383b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
383c0 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
383d0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65  .  /* Check some
383e0 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20   preconditions: 
383f0 0a 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20  .  **   (a) the 
38400 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66  cursor is open f
38410 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a  or writing,.  **
38420 20 20 20 28 62 29 20 74 68 65 72 65 20 69 73 20     (b) there is 
38430 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  no read-lock on 
38440 74 68 65 20 74 61 62 6c 65 20